当我使用TYPE_APPLICATION_OVERLAY时对话框不可见

时间:2018-10-29 10:34:22

标签: android android-8.0-oreo android-accessibility android-overlay

我在其他应用程序顶部显示一个对话框。直到我使用WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

当我将目标版本更改为26时,我不应该使用TYPE_SYSTEM_ALERT,所以我使用了WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

之后,我的对话框不可见。我还要做什么?有任何建议。

参考链接: https://developer.android.com/about/versions/oreo/android-8.0-changes#cwt

代码:

    final Dialog dialog = new Dialog(getApplicationContext());

    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.permission);
    dialog.setCancelable(true);

    dialog.show();

2 个答案:

答案 0 :(得分:1)

对于奥利奥及以上设备,我们必须使用TYPE_APPLICATION_OVERLAY,对于以下设备,我们必须使用TYPE_SYSTEM_ALERT

          final Dialog dialog = new Dialog(getApplicationContext());
          if(oreoAndAbove) {
              dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
          } else {
              dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
          }
          dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
          dialog.setContentView(R.layout.permission);
          dialog.setCancelable(true);

          dialog.show();

答案 1 :(得分:0)

您可能会错过对应用程序的请求权限。请在显示窗口之前检查它。如果应用没有权限,请提出要求。

1。通过以下方式检查权限:

public boolean checkPermission(Context context){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return Settings.canDrawOverlays(context);
    } else {
        return true;
    }
}

2.do通过以下方式请求许可

context.startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.packageName)))