WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY需要android.permission.SYSTEM_ALERT_WINDOW吗?

时间:2017-02-21 10:40:18

标签: android permissions android-permissions

我看到:WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY始终与<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />中的AndroidManifest.xml结合使用。例如here

考虑以下代码:

    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);

我是否需要此代码SYSTEM_ALERT_WINDOW权限?

doc关于SYSTEM_ALERT_WINDOW

  

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

大概是TYPE_SYSTEM_ALERT而不是TYPE_SYSTEM_OVERLAY。 HM?

更新
line: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

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

1 个答案:

答案 0 :(得分:5)

更改
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAYWindowManager.LayoutParams.TYPE_TOAST
从应用设置中删除了android.permission.SYSTEM_ALERT_WINDOW,它可以正常运行。

灵感:here

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
            100, 100,
            WindowManager.LayoutParams.TYPE_TOAST,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
);

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

<强>更新
API {26}已弃用LayoutParams.TYPE_TOAST。请改用LayoutParams.TYPE_APPLICATION_OVERLAY,需要android.Manifest.permission#SYSTEM_ALERT_WINDOW权限=&gt; See more