Ошибка при создании MediaPlayer с Uri или файлом в активах

Я скопировал song.mp3 в свой каталог ресурсов проекта и написал этот код:

private MediaPlayer mp;

Uri uri = Uri.parse("file:///android_asset/song.mp3");

mp=MediaPlayer.create(this, uri);

После запуска инструкции create переменная mp равна null. Что не так?

Спасибо.

Ответ 1

Попробуйте это и посмотрите, пойманы ли какие-либо исключения:

try {
    MediaPlayer mp = new MediaPlayer();
    mp.setDataSource(this, uri);
}
catch (NullReferenceArgument e) {
    Log.d(TAG, "NullReferenceException: " + e.getMessage());
}
catch (IllegalStateException e) {
    Log.d(TAG, "IllegalStateException: " + e.getMessage());
}
catch (IOException e) {
    Log.d(TAG, "IOException: " + e.getMessage());
}
catch (IllegalArgumentException e) {
    Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
}
catch (SecurityException e) {
    Log.d(TAG, "SecurityException: " + e.getMessage());
}

Исключенное исключение объяснит, что происходит в вашем создании. Согласно документам, статический метод create просто сокращает то, что находится в блоке try выше. Основное отличие, которое я вижу, это то, что статический метод create не бросает, пока setDataSource делает.

Ответ 2

Попробуйте следующее:

try {
    AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
    player = new MediaPlayer();
    player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
    player.prepare();
    player.start();
    } 
catch (IllegalArgumentException e) {    } 
catch (IllegalStateException e) { } 
catch (IOException e) { }