我看到: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" />
是必要的。
答案 0 :(得分:5)
更改
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
至WindowManager.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