2013-06-18 3 views
1

В моем приложении я создал класс для обработки воспроизводимого звука, он называется SoundPlayer и расширяет AsyncTask для загрузки звуковых файлов отдельно от основного потока. Это выглядит следующим образом:MediaPlayer OnCompletionListener вызывает ошибку

public class SoundPlayer extends AsyncTask<String, Integer, String> implements 
     OnCompletionListener { 

    private Integer[] soundIDs = {}; 
    private ArrayList<MediaPlayer> sound_player; 
    // private MediaPlayer[] sound_player; 
    private Context context; 
    private static final String DEBUG_TAG = "SoundPlayer"; 
    private Timer timer; 
    private Activity activity; 

    public SoundPlayer(Integer[] soundIDs, Context context, Activity activity) { 
     this.soundIDs = soundIDs; 
     this.context = context; 
     this.activity = activity; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     sound_player = new ArrayList<MediaPlayer>(); 
     for (int i = 0; i < soundIDs.length; i++) { 
      MediaPlayer temp = new MediaPlayer(); 
      temp = MediaPlayer.create(context, soundIDs[i]); 
      sound_player.add(temp); 
      sound_player.get(i).setOnCompletionListener(SoundPlayer.this); 
     } 
     return null; 
    } 



    @Override 
    public void onCompletion(MediaPlayer mp) { 
     Log.e(DEBUG_TAG, "comp"); 

    } 
} 

И я запускаю его от основной деятельности таким образом:

soundplayer = new SoundPlayer(soundIDs, this, this); 
    soundplayer.execute(""); 

Все отлично работает, когда я запускаю appliaction на моем Samsung Galaxy Gio, но когда я запускаю его на Galaxy S2 это не работает. Я заметил, что проблема заключается в том, что линии:

sound_player.get(i).setOnCompletionListener(SoundPlayer.this); 

без этого все работает (на обоих устройствах), однако я должен установить OnCompletionListsner так, что не так? Кроме того, я пытался делать это так:

sound_player.get(i).setOnCompletionListener((OnCompletionListener) context); 

и дать свою основную деятельность по реализации onCompletionListener метод, но он не работает также. Вот LogCat:

06-18 16:15:27.835 W/MediaPlayer(20250): info/warning (1, 44) 
06-18 16:15:27.865 W/MediaPlayer(20250): info/warning (1, 44) 
06-18 16:15:27.900 W/MediaPlayer(20250): info/warning (1, 44) 
06-18 16:15:27.905 I/MediaPlayer(20250): Info (1,44) 
06-18 16:15:27.905 I/MediaPlayer(20250): Info (1,44) 
06-18 16:15:27.905 I/MediaPlayer(20250): Info (1,44) 
06-18 16:15:27.950 W/MediaPlayer(20250): info/warning (1, 44) 
06-18 16:15:27.990 W/MediaPlayer(20250): info/warning (1, 44) 
06-18 16:15:28.005 I/MediaPlayer(20250): Info (1,44) 
06-18 16:15:28.005 I/MediaPlayer(20250): Info (1,44) 
06-18 16:15:28.035 W/MediaPlayer(20250): info/warning (1, 44) 
06-18 16:15:28.035 I/MediaPlayer(20250): Info (1,44) 
06-18 16:15:28.060 W/MediaPlayer(20250): info/warning (1, 44) 
06-18 16:15:28.060 I/MediaPlayer(20250): Info (1,44) 
06-18 16:15:28.085 W/MediaPlayer(20250): info/warning (1, 26) 
06-18 16:15:28.085 I/MediaPlayer(20250): Info (1,26) 
06-18 16:15:28.085 E/MediaPlayer(20250): error (1, -17) 
06-18 16:15:28.085 E/MediaPlayer(20250): Error (1,-17) 
06-18 16:15:28.090 D/MediaPlayer(20250): create failed: 
06-18 16:15:28.090 D/MediaPlayer(20250): java.io.IOException: Prepare failed.: status=0x1 
06-18 16:15:28.090 D/MediaPlayer(20250): at android.media.MediaPlayer.prepare(Native Method) 
06-18 16:15:28.090 D/MediaPlayer(20250): at android.media.MediaPlayer.create(MediaPlayer.java:691) 
06-18 16:15:28.090 D/MediaPlayer(20250): at com.artostolab.scaryringtones.SoundPlayer.doInBackground(SoundPlayer.java:36) 
06-18 16:15:28.090 D/MediaPlayer(20250): at com.artostolab.scaryringtones.SoundPlayer.doInBackground(SoundPlayer.java:1) 
06-18 16:15:28.090 D/MediaPlayer(20250): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
06-18 16:15:28.090 D/MediaPlayer(20250): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
06-18 16:15:28.090 D/MediaPlayer(20250): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
06-18 16:15:28.090 D/MediaPlayer(20250): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
06-18 16:15:28.090 D/MediaPlayer(20250): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
06-18 16:15:28.090 D/MediaPlayer(20250): at java.lang.Thread.run(Thread.java:1019) 

и

06-18 16:25:10.330 W/MediaPlayer(21988): info/warning (1, 26) 
06-18 16:25:10.330 E/MediaPlayer(21988): error (1, -17) 
06-18 16:25:10.335 I/MediaPlayer(21988): Info (1,26) 
06-18 16:25:10.335 E/MediaPlayer(21988): Error (1,-17) 
06-18 16:25:10.335 D/MediaPlayer(21988): create failed: 
06-18 16:25:10.335 D/MediaPlayer(21988): java.io.IOException: Prepare failed.: status=0x1 
06-18 16:25:10.335 D/MediaPlayer(21988): at android.media.MediaPlayer.prepare(Native Method) 
06-18 16:25:10.335 D/MediaPlayer(21988): at android.media.MediaPlayer.create(MediaPlayer.java:691) 
06-18 16:25:10.335 D/MediaPlayer(21988): at com.artostolab.scaryringtones.SoundPlayer.doInBackground(SoundPlayer.java:38) 
06-18 16:25:10.335 D/MediaPlayer(21988): at com.artostolab.scaryringtones.SoundPlayer.doInBackground(SoundPlayer.java:1) 
06-18 16:25:10.335 D/MediaPlayer(21988): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
06-18 16:25:10.335 D/MediaPlayer(21988): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
06-18 16:25:10.335 D/MediaPlayer(21988): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
06-18 16:25:10.335 D/MediaPlayer(21988): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
06-18 16:25:10.335 D/MediaPlayer(21988): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
06-18 16:25:10.335 D/MediaPlayer(21988): at java.lang.Thread.run(Thread.java:1019) 
06-18 16:25:10.335 W/dalvikvm(21988): threadid=8: thread exiting with uncaught exception (group=0x4001e578) 
06-18 16:25:10.340 E/AndroidRuntime(21988): FATAL EXCEPTION: AsyncTask #1 
06-18 16:25:10.340 E/AndroidRuntime(21988): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.lang.Thread.run(Thread.java:1019) 
06-18 16:25:10.340 E/AndroidRuntime(21988): Caused by: java.lang.NullPointerException 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at com.artostolab.scaryringtones.SoundPlayer.doInBackground(SoundPlayer.java:40) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at com.artostolab.scaryringtones.SoundPlayer.doInBackground(SoundPlayer.java:1) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
06-18 16:25:10.340 E/AndroidRuntime(21988):  ... 4 more 
06-18 16:25:10.345 E/  (2696): Dumpstate > /data/log/dumpstate_app_error 
06-18 16:25:10.345 W/ActivityManager(2696): Force finishing activity com.artostolab.scaryringtones/.MainList 

Спасибо за помощь

ответ

0

Я нашел решение самостоятельно, не знаю, почему, но установка onCompletionListener внутри doInBackground вызывает исключение нулевого указателя на некоторых устройствах, поэтому я решил установить OnCompletionListner вне этого метода, например, когда вы хотите играть звук и его работа

0

Я думаю, что происходит в том, что ваш звонок MediaPlayer.create(context, soundIDs[i]); не удалось (см трассировку стека - «java.io.IOException : Prepare failed "), поэтому temp имеет значение null.

Создание многих экземпляров MediaPlayer может быть основной причиной. У меня есть приложение, которое воспроизводит последовательность отдельных образцов звука, и я создаю свои экземпляры на лету.

+0

Но это не происходит, когда я не использую эту строку: «sound_player.get (I) .setOnCompletionListener (SoundPlayer.this);» Без него все работает нормально, поэтому я думаю, что проблема заключается не в создании множества экземпляров MediaPlayer. – Janek

+0

Да. Но (если моя теория верна), вы просто поместили нулевое значение в массив, поэтому sound_player.get (i) вернется null, и вы вызываете setOnCompletionListener на нулевом объекте, следовательно, NPE ... – Phil

+0

Он будет исправлен, но я протестировал его и попытался воспроизвести звук с помощью этого массива, и он работал нормально, поэтому я думаю, что это не проблема – Janek

Смежные вопросы