NullPointerException при попытке воспроизвести звук с MediaPlayer - PullRequest
1 голос
/ 30 сентября 2011

Итак, у меня есть простое приложение типа Soundboard, которое работает через ListView. Нажмите на элемент, он воспроизводит звук. У меня есть открытый статический int [] с именем soundResourceList, в котором есть такие записи, как R.raw.foo, R.raw.bar в том же порядке, что и записи, связанные с текстом в ListView.

Этот код работал для многих пользователей, включая меня, однако один недавно опубликовал исключение NullPointerException, в частности из строки setOnCompletionListener. Для меня это означает, что MediaPlayer.create вернул null, но я не могу понять, почему он не работает на их устройстве, а не на всех остальных.

public void onListItemClick(ListView parent, View v, int position, long id) {
    MediaPlayer mp = MediaPlayer.create(getBaseContext(), soundResourceList[position]);
    mp.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }
    });
    mp.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
}

Обычно NPE с MediaPlayer происходит из-за того, что он не выпускает свой предыдущий экземпляр, но я уже решил эту проблему, как показано в коде. Так что же мне не хватает, что может привести к сбою MediaPlayer.create ()?

1 Ответ

2 голосов
/ 30 сентября 2011

В методе create указывается:

Returns
    a MediaPlayer object, or null if creation failed

Поскольку для каждого MediaPlayer может быть выделено несколько низкоуровневых ресурсов, возможно, если GC занят дляв то время как или не работает, у вас закончатся звуковые буферы (или что-то еще), и выделение MediaPlayer завершится неудачно, возвращая ноль.

Если это все относительно короткие звуковые фрагменты, вы можете посмотреть на android.media.SoundPool .

...