【问题标题】:pop up wiindow with notification even apllication is not running即使应用程序未运行,也会弹出带有通知的窗口
【发布时间】:2019-09-26 08:27:21
【问题描述】:

这是我的代码,我会按时收到通知,但应用程序在弹出时出现崩溃

 private void showCustomPopupMenu()
{
    WindowManager windowManager2 = (WindowManager) App.getAppContext().getSystemService(WINDOW_SERVICE);
    LayoutInflater layoutInflater=(LayoutInflater)App.getAppContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view=layoutInflater.inflate(R.layout.window_popup_medicine, null);

    int LAYOUT_FLAG;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
    }

  WindowManager.LayoutParams  params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            LAYOUT_FLAG,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

        params.gravity=Gravity.CENTER|Gravity.CENTER;
        params.x=0;
        params.y=0;
    assert windowManager2 != null;
    windowManager2.addView(view, params);
    }

我得到了这样的错误:

Unable to add window android.view.ViewRootImpl$W@46b5050 -- permission denied for window type 2038

我已添加所有权限:

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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

请解决这个问题,非常感谢您的回答并提前感谢您

【问题讨论】:

  • 我通过将 Intent 传递给我没有得到的活动来解决
  • 我们能否在应用关闭时显示来自前台服务的弹出窗口

标签: android notifications 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) {
                alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
            }else{
                alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            }

将您的TYPE_PHONE 更改为TYPE_SYSTEM_ALERT

您还应该参考this 答案。如果您仍有疑问,请告诉我。

现在当通知到达时,检查一下:

  public void notificationArrived(String myMsg){

      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                final boolean overlayEnabled = Settings.canDrawOverlays(MyFirebaseMessagingService.this);
                Global.printLog("showTaskDetailPopup==", "overlayEnabled" + overlayEnabled);

                if (!overlayEnabled) return;
            }

  new Handler(Looper.getMainLooper()).post(new Runnable() {
            public void run() {

                final Dialog dialog = new Dialog(MyFirebaseMessagingService.this);
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.setContentView(R.layout.window_popup_medicine);
                dialog.setCancelable(true);

                TextView tv_msg = dialog.findViewById(R.id.tv_msg);

                    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);
                    }
                    dialog.show();
                }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
     }

【讨论】:

  • @bugfreerammohan 如果您对此有任何疑问,我还添加了参考链接
  • 我正在使用这个通知,但我仍然收到同样的错误
  • 因为您必须拥有覆盖权限才能打开此对话框。所以首先获得覆盖许可。参考这个:stackoverflow.com/questions/32558153/…
  • windowManager2.addView(view, params);在此行中出现错误并出现相同的错误 2019-09-26 14:23:10.035 12825-12825/com.kulsoft.care4cute E/AndroidRuntime: FATAL EXCEPTION: main Process: com.kulsoft.care4cute, PID: 12825 android.view。 WindowManager$BadTokenException: 无法添加窗口 android.view.ViewRootImpl$W@191cd10 -- 窗口类型 2038 的权限被拒绝
  • 首先让我知道您是否启用了叠加权限?因为当通知到达时我也会显示弹出窗口
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2019-12-16
相关资源
最近更新 更多