来自 MediaPlayer onPause() 的 NullPointerException 丢失引用
NullPointerException from MediaPlayer onPause() looses reference
我从 activity 退出时通过 onPause() 方法从 MediaPlayer 得到 NullPointerException。奇怪的是我没有从 LogCat 中得到任何错误 - 我必须这样做 if(mp == null) Log.i(TAG, "mp is null");这会记录到 LogCat。退出后声音播放几秒后停止。
我从 onPause() 调用的这个方法:
void releaseThis(){
if(mp == null) Log.i("ASD", "nie ma mediaplayera");
if (mp != null) {
if(mp.isPlaying()){
mp.stop();
}
Log.i("ASD", "a tu już jest mediaplayer");
mp.reset();
mp.release();
mp = null;
}
if(wl.isHeld()){
wl.release();
}
}
基本架构:
public class CallScreen extends Activity{
MediaPlayer mp;
private PowerManager.WakeLock wl = null;
onCreate(){
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag");
wl.acquire();
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
playSound(getApplicationContext(), notification);
}
playSound(context, alert){
(here's the beef)
}
}
日志:
04-13 14:55:29.934 32338 32338 E AndroidRuntime: java.lang.RuntimeException: Unable to pause activity {com.klangstudios.fakecall/com.klangstudios.fakecall.CallScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3312)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3259)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3234)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.access00(ActivityThread.java:148)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5312)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.releaseThisShit(CallScreen.java:94)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.onPause(CallScreen.java:106)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.Activity.performPause(Activity.java:6064)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1317)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3292)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: ... 11 more
04-13 14:55:51.658 32581 32581 E AndroidRuntime: FATAL EXCEPTION: main
04-13 14:55:51.658 32581 32581 E AndroidRuntime: Process: com.klangstudios.fakecall, PID: 32581
04-13 14:55:51.658 32581 32581 E AndroidRuntime: java.lang.RuntimeException: Unable to pause activity {com.klangstudios.fakecall/com.klangstudios.fakecall.CallScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3312)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3259)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3234)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.access00(ActivityThread.java:148)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5312)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.releaseThisShit(CallScreen.java:94)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.onPause(CallScreen.java:106)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.Activity.performPause(Activity.java:6064)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1317)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3292)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: ... 11 more
04-13 15:19:15.822 10261 10261 E AndroidRuntime: FATAL EXCEPTION: main
04-13 15:19:15.822 10261 10261 E AndroidRuntime: Process: com.klangstudios.fakecall, PID: 10261
04-13 15:19:15.822 10261 10261 E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {com.klangstudios.fakecall/com.klangstudios.fakecall.CallScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2995)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3030)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1336)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5312)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.onResume(CallScreen.java:106)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1264)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.Activity.performResume(Activity.java:6039)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2978)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: ... 9 more
04-13 15:39:49.540 16631 16646 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xb4e84e56 in tid 16646 (Binder_1)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
如果你仔细阅读这里,你会发现问题出在isHeld()
就像在 mp
上所做的那样,只需在 wl
上添加一个检查即可。
类似
if(wl != null){
if(wl.isHeld()){
wl.release();
}
}
现在可以了。您只需要从 onCreate() 中删除 playSound() 并将其放入 onResume(),因为 onResume() 总是在 Activity 进入前台之前被调用。
参考:http://developer.android.com/reference/android/app/Activity.html
快速回答:
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
//stop music
mediaPlayer.stop();
mediaPlayer.reset();
}
我从 activity 退出时通过 onPause() 方法从 MediaPlayer 得到 NullPointerException。奇怪的是我没有从 LogCat 中得到任何错误 - 我必须这样做 if(mp == null) Log.i(TAG, "mp is null");这会记录到 LogCat。退出后声音播放几秒后停止。
我从 onPause() 调用的这个方法:
void releaseThis(){
if(mp == null) Log.i("ASD", "nie ma mediaplayera");
if (mp != null) {
if(mp.isPlaying()){
mp.stop();
}
Log.i("ASD", "a tu już jest mediaplayer");
mp.reset();
mp.release();
mp = null;
}
if(wl.isHeld()){
wl.release();
}
}
基本架构:
public class CallScreen extends Activity{
MediaPlayer mp;
private PowerManager.WakeLock wl = null;
onCreate(){
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag");
wl.acquire();
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
playSound(getApplicationContext(), notification);
}
playSound(context, alert){
(here's the beef)
}
}
日志:
04-13 14:55:29.934 32338 32338 E AndroidRuntime: java.lang.RuntimeException: Unable to pause activity {com.klangstudios.fakecall/com.klangstudios.fakecall.CallScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3312)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3259)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3234)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.access00(ActivityThread.java:148)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5312)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.releaseThisShit(CallScreen.java:94)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.onPause(CallScreen.java:106)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.Activity.performPause(Activity.java:6064)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1317)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3292)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: ... 11 more
04-13 14:55:51.658 32581 32581 E AndroidRuntime: FATAL EXCEPTION: main
04-13 14:55:51.658 32581 32581 E AndroidRuntime: Process: com.klangstudios.fakecall, PID: 32581
04-13 14:55:51.658 32581 32581 E AndroidRuntime: java.lang.RuntimeException: Unable to pause activity {com.klangstudios.fakecall/com.klangstudios.fakecall.CallScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3312)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3259)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3234)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.access00(ActivityThread.java:148)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5312)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.releaseThisShit(CallScreen.java:94)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.onPause(CallScreen.java:106)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.Activity.performPause(Activity.java:6064)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1317)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3292)
04-13 14:55:51.658 32581 32581 E AndroidRuntime: ... 11 more
04-13 15:19:15.822 10261 10261 E AndroidRuntime: FATAL EXCEPTION: main
04-13 15:19:15.822 10261 10261 E AndroidRuntime: Process: com.klangstudios.fakecall, PID: 10261
04-13 15:19:15.822 10261 10261 E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {com.klangstudios.fakecall/com.klangstudios.fakecall.CallScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2995)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3030)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1336)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5312)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at com.klangstudios.fakecall.CallScreen.onResume(CallScreen.java:106)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1264)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.Activity.performResume(Activity.java:6039)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2978)
04-13 15:19:15.822 10261 10261 E AndroidRuntime: ... 9 more
04-13 15:39:49.540 16631 16646 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xb4e84e56 in tid 16646 (Binder_1)
04-13 14:55:29.934 32338 32338 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.PowerManager$WakeLock.isHeld()' on a null object reference
如果你仔细阅读这里,你会发现问题出在isHeld()
就像在 mp
上所做的那样,只需在 wl
上添加一个检查即可。
类似
if(wl != null){
if(wl.isHeld()){
wl.release();
}
}
现在可以了。您只需要从 onCreate() 中删除 playSound() 并将其放入 onResume(),因为 onResume() 总是在 Activity 进入前台之前被调用。
参考:http://developer.android.com/reference/android/app/Activity.html
快速回答:
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
//stop music
mediaPlayer.stop();
mediaPlayer.reset();
}