【问题标题】:NullPointerException from MediaPlayer onPause() looses reference来自 MediaPlayer onPause() 的 NullPointerException 失去参考
【发布时间】:2020-04-02 16:40:50
【问题描述】:

退出活动时,我通过 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.access$1000(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.access$1000(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)

【问题讨论】:

  • 首先,使用命令adb shell bugreport > log.txt获取日志。
  • 完成了,但我认为我无法将其粘贴到此处 - 太长了
  • 只需在文件中找到NullPointerException,日志跟踪应该在那里。
  • @yummy 知道了,更新了我的问题
  • 下面还有更多,大概有 50 行相关,这是一个异常堆栈跟踪,从 statck 跟踪我们可以找出是哪一行导致了异常。

标签: android android-mediaplayer


【解决方案1】:

现在可以了。你只需要从 onCreate() 中删除 playSound() 并将其放到 onResume() 中,因为 onResume() 总是在 Activity 到达前台之前被调用。

参考:http://developer.android.com/reference/android/app/Activity.html

【讨论】:

    【解决方案2】:

    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();
        }
    }
    

    【讨论】:

    • 这不能解决问题。如果它在一个活动中并且变量是全局的,我不明白为什么这两个会丢失引用。
    • 好吧,根据您的例外情况,它应该可以解决问题。也许您应该尝试发布大部分代码。例如,您声明 wlmp
    • 这里有更多代码 - 只是不想让这个问题完全与代码有关:stackoverflow.com/questions/29591199/…
    • private PowerManager.WakeLock wl = null; 在我看来 wl 始终为空!我没有看到分配给它的任何其他值。
    • 忘记在此处包含它。完成!
    【解决方案3】:

    快速回答:

    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
    
            //stop music
            mediaPlayer.stop();
            mediaPlayer.reset();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-29
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多