UnsupportedOperationException:试图从与一个无关的上下文中获取显示

问题描述 投票:0回答:2

我在实时应用程序上遇到 UnsupportedOperationException 崩溃。所有崩溃都与 Moto Android 11 设备有关。可以看出它与 onKeyUp 有某种关系。但仍然不知道如何重现或解决这个问题。 任何帮助将不胜感激。

Fatal Exception: java.lang.UnsupportedOperationException: Tried to obtain display from a Context not associated with  one. Only visual Contexts (such as Activity or one created with Context#createWindowContext) or ones created with Context#createDisplayContext are associated with displays. Other types of Contexts are typically related to background entities and may return an arbitrary display.
   at android.app.ContextImpl.getDisplay(ContextImpl.java:2580)
   at android.content.ContextWrapper.getDisplay(ContextWrapper.java:1030)
   at android.content.ContextWrapper.getDisplay(ContextWrapper.java:1030)
   at android.app.Activity.onKeyUp(Activity.java:3859)
   at android.view.KeyEvent.dispatch(KeyEvent.java:2866)
   at android.app.Activity.dispatchKeyEvent(Activity.java:4176)
   at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:122)
   at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:84)
   at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:140)
   at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:558)
   at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
   at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2814)
   at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
   at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:418)
   at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6101)
   at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5969)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5464)
   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5521)
   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5487)
   at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5639)
   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5495)
   at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5696)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5468)
   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5521)
   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5487)
   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5495)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5468)
   at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8313)
   at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8229)
   at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8190)
   at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:5219)
   at android.os.Handler.dispatchMessage(Handler.java:106)
   at android.os.Looper.loop(Looper.java:250)
   at android.app.ActivityThread.main(ActivityThread.java:7766)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
android keyup motorola
2个回答
0
投票

作为一种解决方法,您可以在 Activity 中覆盖

onKeyUp
onKeyDown
(不幸的是我看不到您的完整 stackTrace,所以我不知道您需要覆盖哪种方法)并像这样在其中返回 true/false

    override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
        return false
    }
    
    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        return false
    }


0
投票

当您在 Activity 中覆盖 attachBaseContext 时,请确保您没有设置与显示无关的基本上下文,非可视上下文(如应用程序或服务上下文)是不行的,这将导致运行时崩溃当您按下小键盘/键盘上的某些键时,摩托罗拉设备。 G30、G60、G60s 在我的案例中,请注意一些摩托罗拉设备不受影响。

所以在您的活动中,当您重写 attachBaseContext() 时,请确保您实际上在 someMethodThatReturnsNewBaseContext() 方法中返回了正确的上下文。

override fun attachBaseContext(newBase: Context) {
    val newBaseContext = someMethodThatReturnsNewBaseContext(newBase)
    super.attachBaseContext(newBaseContext)
}

我发现我在我的 someMethodThatReturnsNewBaseContext() 实现中返回 context.applicationContext.createConfigurationContext() ,一旦我直接返回 context.createConfigurationContext() 问题就在摩托罗拉设备上解决了。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.