Android闹钟应用程序在Oreo下仅使用NullPointerException崩溃SystemUI(仅限)

时间:2017-12-20 22:06:10

标签: android

我有一个Android闹钟应用。我有通常的(?)警报意图 - >接收器 - >活动链,其最后一步创建一个全屏窗口并发出警报。

所有这些都适用于Android的前Oreo(API 26)版本。但是在Oreo上,当警报触发时,系统UI崩溃,我在模拟器中得到这个异常(稍微重新格式化):

        12-12 01:15:02.864 9570-9570/com.android.systemui E/AndroidRuntime: 
    FATAL EXCEPTION: main
Process: com.android.systemui, PID: 9570
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.systemui.statusbar.phone.NavigationBarFragment.onKeyguardOccludedChanged(boolean)' on a null object reference
at com.android.systemui.statusbar.phone.StatusBar.onKeyguardOccludedChanged(StatusBar.java:3843)
at com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.setOccluded(StatusBarKeyguardViewManager.java:277)
at com.android.systemui.keyguard.KeyguardViewMediator.handleSetOccluded(KeyguardViewMediator.java:1176)
at com.android.systemui.keyguard.KeyguardViewMediator.-wrap14(Unknown Source:0)
at com.android.systemui.keyguard.KeyguardViewMediator$4.handleMessage(KeyguardViewMediator.java:1531)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

作为一种可能的线索,我发现当我从WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED移除win.addFlags()时,它并没有崩溃 - 但当然,它也没有在手机锁定时显示闹钟。

我不记得我尝试过的所有事情,但这里有一些事情:

  1. 找到Android的StatusBar.java源代码,试图弄清楚哪些东西是空的,不应该是。显然,我的Google-fu在这里失败了。
  2. 使用getSystemService(KeyguardManager.class).requestDismissKeyguard(this, null);
  3. 之类的内容明确解雇键盘锁
  4. 使用WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
  5. 解雇键盘锁
  6. 两者都明确显示并明确隐藏状态栏。
  7. 我想我在锁定时尝试了一些显示窗口的方法 - 比如调用setShowWhenLocked(true)或类似的东西。但它没有帮助,无论如何,该方法仅在API 27中添加,因此即使已经工作,它也无法解决API 26的问题。
  8. 嗯......我不再记得的其他事情。
  9. 这些都没有任何影响。

    显然,这个可以工作,因为其他闹钟应用程序在Oreo下工作。我做错了什么?

1 个答案:

答案 0 :(得分:4)

似乎已修复的已知错误。特别是在模拟器上。 因此,请更新模拟器中使用的图像。

如果我正确地解释它,它似乎根据历史似乎存在于原始的奥利奥版本中。在8.0.0_r21及更高版本中修复,出现在8.0.0_r17及更早版本中,并且看不到它们之间的任何内容。

奥利奥的确切版本,你试过8.1和/或各种补丁级别吗? 因为它是根据这个提交在9月20日修复的,也许是另一个提交:

https://android.googlesource.com/platform/frameworks/base/+/8078996f4a8b1718a2ca56ff52fd1f4d522e7720%5E1..8078996f4a8b1718a2ca56ff52fd1f4d522e7720/

可能: https://android.googlesource.com/platform/frameworks/base/+/9c4faa85f1bc4ffc2aa949da7b5d8439f4c638a2

或者他们相关的源提交(注意到它是合并提交)。 我引用其中一个:

  

修复启动过程中随机系统崩溃

     

当尝试在模拟器中启动android时,systemui可能会因为a而崩溃   mNavigationBar的未初始化值可能是因为某些种族   初始化期间由仿真性能问题引起的条件