美文网首页
2020-03-30

2020-03-30

作者: EnzoRay | 来源:发表于2020-03-30 19:38 被阅读0次

    一般启动Dialog都是传入Activity实例,是否可以通过传入Context启动Dialog?
    如果我们注册Intent.ACTION_SCREEN_ON广播,然后从广播启动Dialog,会报错:
    Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
    说明不能直接传入Context启动Dialog,此时我们需要做一些改装在onCreate方法中加入

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
            } else {
                getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            }
    

    但是在8.0以上系统的手机上仍然显示不出Dialog,报错是:
    Unable to add window android.view.ViewRootImpl$W@fadf9d4 -- permission denied for window type 2038
    这时候需要去设置里面打开Display over other apps权限

    if (!Settings.canDrawOverlays(MainActivity.this)){
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); 
            startActivity(intent)
    }
    

    同时要在Manifest.xml文件里面加入权限:
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    否在跳转的Display over apps页面里面找不到你的APP。
    这样就可以传Context启动自定义Dialog了

    相关文章

      网友评论

          本文标题:2020-03-30

          本文链接:https://www.haomeiwen.com/subject/mizvuhtx.html