按后退按钮停止媒体播放器
Stop media player on press of back button
我有一个媒体播放器,可以播放 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.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)
在 onDestroy() 中,无需调用 this.finish(),因为 activity 已经完成。删除该行并重试。
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();
}
你应该在发布前调用 super.onbackpressed()..试试这个代码
@Override
public void onBackPressed() {
super.onBackPressed();
System.out.println("onBackPressed() called");
releaseMediaPlayer();
}
查看日志,错误似乎发生在您发布到 Handler
的 Runnable
中。我猜您是使用 postDelayed() 发布它以定期更新 UI 或基于 MediaPlayer
状态的内容。我对吗?您在 onDestroy() 中将 mp 设置为 null 但 Runnable
保留 运行 并尝试访问它,导致 NullPointerException
.
要解决此问题,您需要在 onDestroy() 中清除处理程序的待处理 Runnable 队列,如下所示:
mHandler.removeCallbacks(null);
更好的方法是在 onPause() 中执行此操作,然后在 onResume() 中重新启动它
@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();第一
我有一个媒体播放器,可以播放 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.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)
在 onDestroy() 中,无需调用 this.finish(),因为 activity 已经完成。删除该行并重试。
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();
}
你应该在发布前调用 super.onbackpressed()..试试这个代码
@Override
public void onBackPressed() {
super.onBackPressed();
System.out.println("onBackPressed() called");
releaseMediaPlayer();
}
查看日志,错误似乎发生在您发布到 Handler
的 Runnable
中。我猜您是使用 postDelayed() 发布它以定期更新 UI 或基于 MediaPlayer
状态的内容。我对吗?您在 onDestroy() 中将 mp 设置为 null 但 Runnable
保留 运行 并尝试访问它,导致 NullPointerException
.
要解决此问题,您需要在 onDestroy() 中清除处理程序的待处理 Runnable 队列,如下所示:
mHandler.removeCallbacks(null);
更好的方法是在 onPause() 中执行此操作,然后在 onResume() 中重新启动它
@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();第一