2015-01-10 96 views
1

我有一個媒體播放器播放來自URL的MP3。當我播放歌曲並按下後退按鈕時,應用程序會發出錯誤信息。我用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(); 
} 

OR release..try前

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()這個代碼

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

} 
0

望着日誌,它出現的錯誤是發生在您發佈到HandlerRunnable內部。我猜你已經使用postDelayed()發佈它來定期更新UI或基於MediaPlayer狀態的內容。我對嗎?您在onDestroy()中將mp設置爲null,但Runnable繼續運行並嘗試訪問它,導致NullPointerException

要解決這個問題,你需要明確在你的onDestroy(待定的Runnable的處理程序的隊列),就像這樣:

mHandler.removeCallbacks(null); 

更妙的是做你的onPause(),然後重新啓動它onResume()

相關問題