【问题标题】:Incoming call popup Error : Unable to add window android.view.ViewRootImpl$W@e5b2272 -- permission denied for window type 2003来电弹出错误:无法添加窗口 android.view.ViewRootImpl$W@e5b2272 -- 窗口类型 2003 的权限被拒绝
【发布时间】:2019-09-27 08:59:49
【问题描述】:

我在来电时制作了弹出窗口。对于 Android 8.0 以上的版本,它会给出以下错误:

无法添加窗口 android.view.ViewRootImpl$W@e5b2272 -- 权限 拒绝窗口类型 2003

此链接描述了解决方案,但我使用 customdialog。 链接:Android: Unable to add window. Permission denied for this window type

 if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
        return;

        // Popup
    else {
        this.context = context;
        if(dialog == null){
            dialog = new CustomDialog(context);
            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |

                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
            dialog.show();
        }

 telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        listener = new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                String stateString = "N/A";
                switch (state) {
                    case TelephonyManager.CALL_STATE_IDLE:
                        stateString = "Idle";
                        dialog.dismiss();
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        stateString = "Off Hook";
                        dialog.dismiss();
                        break;
                    case TelephonyManager.CALL_STATE_RINGING:
                        stateString = "Ringing";
                        dialog.show();
                        break;
                }
            }
        };

【问题讨论】:

    标签: java android popup


    【解决方案1】:

    您需要拥有 ACTION_MANAGE_OVERLAY_PERMISSION 权限才能在您的应用处于后台或未打开时打开/显示警报。

     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    
      <uses-permission
            android:name="android.permission.INTERNAL_SYSTEM_WINDOW"
            tools:ignore="ProtectedPermissions" />
    

    设置警报类型为“TYPE_APPLICATION_OVERLAY”。

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

    您必须检查此answer。如果您仍有疑问,请告诉我

    【讨论】:

    • @Selena 你试过 ACTION_MANAGE_OVERLAY_PERMISSION 吗??
    • 我在清单文件中添加了权限。但它没有。如何从设置页面向用户显示 ACTION_MANAGE_OVERLAY_PERMISSION 权限?
    • 它不会显示在设置页面中。当用户在应用程序中时,您需要以编程方式获取权限。检查这个:stackoverflow.com/questions/58112575/…
    • 我看不到你说的链接。我无法重定向到设置页面。你能帮帮我吗?
    • stackoverflow.com/questions/32558153/… 按照我在这里提到的步骤进行
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2013-01-25
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多