4

我在其他应用程序之上显示一个对话框。它一直有效,直到我使用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();
4

2 回答 2

3

对于 oreo 及以上设备我们必须使用 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();
于 2018-10-31T11:16:44.577 回答
2

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

1.检查权限:

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

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

context.startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.packageName)))
于 2018-10-29T13:15:01.473 回答