2015-01-10 4 views
1

У меня есть медиаплеер, который воспроизводит mp3 с URL-адреса. Когда я воспроизвожу песню и нажимаю кнопку «Назад», приложение выдает сообщение об ошибке. Я использовал prepareAsync();.Остановка медиаплеера при нажатии кнопки «Назад»

Я новичок, поэтому извините, если вы не можете меня хорошо понять.

Вот моя функция play и функция ondestroy. Благодарю.

public void playSong(final int naatindex){ 
    // Play song 
    tv = (TextView) this.findViewById(R.id.mywidget); 
    try { 
     mp.reset(); 
     mp.setDataSource(naatpaths[naatindex]); 
     Log.w("Play Song", "CS"+naatindex); 
     tv.setText("Buffering Please Wait....!"); 
     songCurrentDurationLabel.setVisibility(View.INVISIBLE); 
     tv.setSelected(true); 
     songTotalDurationLabel.setVisibility(View.INVISIBLE); 
     mp.prepareAsync(); 
     mp.setOnPreparedListener(new OnPreparedListener(){ 
      @Override 
      public void onPrepared(MediaPlayer mp){ 
       songCurrentDurationLabel.setVisibility(View.VISIBLE); 
       songTotalDurationLabel.setVisibility(View.VISIBLE); 

        mp.start(); 

        tv.setText(naattitles[naatindex]); 
        // Changing Button Image to pause image 
        btnPlay.setImageResource(R.drawable.btn_pause); 
        // set Progress bar values 
        songProgressBar.setProgress(0); 
        songProgressBar.setMax(100); 
        // Updating progress bar 
        updateProgressBar(); 
      } 
     }); 



     mp.setOnErrorListener(new OnErrorListener() { 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       Log.w("Unable to Play", "CS"+naatindex); 
       playSong(currentSongIndex+1); 
       return false; 
      } 
     }); 




     // Set focus to the textview 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

    @Override 
    public void onDestroy(){ 
    mp.release(); 
    mp = null; 
    super.onDestroy(); 
    } 

вот мой журнал ошибок

01-10 16:16:40.339: W/dalvikvm(26539): threadid=1: thread exiting with uncaught exception (group=0x416282a0) 
01-10 16:16:40.344: E/AndroidRuntime(26539): FATAL EXCEPTION: main 
01-10 16:16:40.344: E/AndroidRuntime(26539): java.lang.NullPointerException 
01-10 16:16:40.344: E/AndroidRuntime(26539): at com.maulantariqjameel.bayyan.media_player$1.run(media_player.java:5032) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at android.os.Handler.handleCallback(Handler.java:615) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at android.os.Looper.loop(Looper.java:137) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at android.app.ActivityThread.main(ActivityThread.java:4921) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at java.lang.reflect.Method.invokeNative(Native Method) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at java.lang.reflect.Method.invoke(Method.java:511) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
01-10 16:16:40.344: E/AndroidRuntime(26539): at dalvik.system.NativeStart.main(Native Method) 

ответ

2
@Override 
protected void onDestroy() { 
if (runnableObject != null) 
myHandler.removeCallbacks(runnableObject); 
super.onDestroy(); 
} 
private void backPressed() { 
if (mpAudioSdCard != null) { 
      mpAudioSdCard.stop(); 
      mpAudioSdCard.release(); 
      mpAudioSdCard = null; 
     } 

} 

попробуйте это, это сработает для меня. Я думаю, что ошибка ур - ур вызов super.onDestroy(); сначала

+0

Это хорошо работает .... Thanxxx –

0

В OnDestroy() нет необходимости вызывать this.finish(), так как деятельность уже закончена. Удалите эту строку и повторите попытку.

+0

Да, друг, я удаляю this.finish(), но все же он дает ошибку. при закрытии приложения –

+0

Если бы вы могли опубликовать точную трассировку ошибки, я смогу вам помочь. –

+0

да, пожалуйста, я показываю журнал ошибок –

1
private void releaseMediaPlayer() { 
    if (mp!= null) { 
     if(mp.isPlaying()) { 
      mp.stop(); 
     } 
     mp.release(); 
     mp= null; 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    releaseMediaPlayer(); 
} 

ИЛИ

private void releaseMediaPlayer() { 
    if (mp!= null) { 
     if(mp.isPlaying()) { 
      mp.stop(); 
     } 
     mp.release(); 
     mp= null; 
    } 
} 

@Override 
public void onBackPressed() { 
    releaseMediaPlayer(); 
    finish(); 
} 
+0

Друг, я попробовал это, но все же даю ошибку, могу ли я выслать вам данные журнала –

+0

Ни один друг не получил ошибку –

0

Вы должны позвонить super.onbackpressed() перед release..try этот код

@Override 
public void onBackPressed() { 
super.onBackPressed(); 
System.out.println("onBackPressed() called"); 
releaseMediaPlayer(); 

} 
0

Глядя на журналы, оказывается, что ошибка происходящее внутри Runnable, которое вы отправили на адрес Handler. Я предполагаю, что вы разместили его с помощью функции postDelayed() для обновления пользовательского интерфейса или чего-либо, основанного на состоянии MediaPlayer с регулярным интервалом. Я прав? Вы устанавливаете mp в null в onDestroy(), но Runnable продолжает работать и пытается получить к нему доступ, вызывая NullPointerException.

Чтобы это исправить, вам нужно очистить очередь обработчика отложенных Runnables в вашем OnDestroy(), как это:

mHandler.removeCallbacks(null); 

Еще лучше сделать это в вашем OnPause(), а затем перезапустить его onResume()

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