我是否需要android.permission.SYSTEM_ALERT_WINDOW作为WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY?

t0m*_*t0m 4 permissions android android-permissions

我已经看到:WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY始终与<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />in 结合使用AndroidManifest.xml。例如这里

考虑以下代码:

    windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
    surfaceView = new SurfaceView(this);
    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
            100, 100,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT
    );
    layoutParams.gravity = Gravity.START | Gravity.TOP;
    windowManager.addView(surfaceView, layoutParams);
Run Code Online (Sandbox Code Playgroud)

我需要此代码SYSTEM_ALERT_WINDOW权限吗?

来自doc的有关SYSTEM_ALERT_WINDOW

允许应用使用TYPE_SYSTEM_ALERT类型创建窗口,该窗口显示在所有其他应用的顶部。很少有应用程序应使用此权限;这些窗口用于与用户进行系统级交互。

大约TYPE_SYSTEM_ALERT不是TYPE_SYSTEM_OVERLAY。嗯?

更新:
行:windowManager.addView(surfaceView, layoutParams);

java.lang.RuntimeException: Unable to create service: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@10dca8ac -- permission denied for this window type
Run Code Online (Sandbox Code Playgroud)

因此可能<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />是必要的。

t0m*_*t0m 5

更改
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAYWindowManager.LayoutParams.TYPE_TOAST
android.permission.SYSTEM_ALERT_WINDOW已从Apps设置中删除,并且可以正常运行。

启发:这里

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
            100, 100,
            WindowManager.LayoutParams.TYPE_TOAST,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
);
Run Code Online (Sandbox Code Playgroud)

似乎不需要此解决方案 android:name="android.permission.SYSTEM_ALERT_WINDOW"

UPDATE
LayoutParams.TYPE_TOAST从API 26开始弃用。请LayoutParams.TYPE_APPLICATION_OVERLAY改为使用,它需要android.Manifest.permission#SYSTEM_ALERT_WINDOW权限=> 查看更多