Ошибка создания MediaPlayer с Uri или файлом в активах - PullRequest
10 голосов
/ 22 июня 2010

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

private MediaPlayer mp;

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

mp=MediaPlayer.create(this, uri);

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

Спасибо.

Ответы [ 2 ]

21 голосов
/ 29 марта 2011

Попробуйте это:

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) { } 
6 голосов
/ 22 июня 2010

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

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 -.

...