我比较喜欢这篇文章但是我在将viewgroup添加到windowmanager对象时遇到了错误,我已经使用相同的服务类来发布到问题而没有任何变化,我可能会误认为我没有得到它
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params); // here
Run Code Online (Sandbox Code Playgroud)
当我向WindowManger添加视图时
这是我的清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.searce.testoverlay"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="TestOverlayActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".HUD"></service>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
错误
09-27 18:49:23.561: ERROR/AndroidRuntime(653): Uncaught handler: thread main exiting due to uncaught exception
09-27 18:49:23.571: ERROR/AndroidRuntime(653): java.lang.RuntimeException: Unable to create service com.searce.testoverlay.HUD: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type …Run Code Online (Sandbox Code Playgroud) 我工作的一个应用程序,我需要显示一些信息的窗口ON未解锁手机的锁屏(键盘保护).我想我可以用WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG做到这一点
但每次我的应用程序崩溃时出现以下错误:
android.view.WindowManager $ BadTokenException:无法添加窗口android.view.ViewRootImpl$W@40ec8528 - 此窗口类型的权限被拒绝
这些帖子(这里,这里和这里)都给出了相同的答案.在清单文件中添加以下权限.
android.permission.SYSTEM_ALERT_WINDOW
我已经实现的解决方案,但我仍然得到相同的错误.我知道我做错了什么?
以下是我的清单文件中的权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidpilot.keyguardwindow" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
Run Code Online (Sandbox Code Playgroud)
这是我用来将Window添加到锁定屏幕的代码
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = mInflater.inflate(R.layout.lock_screen_notif, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED …Run Code Online (Sandbox Code Playgroud) 我试图创建一个高于其他应用程序的视图:
WindowManager.LayoutParams paramsDirectorView = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)
我查看了其他回复,发现了以下"绘制应用程序"的内容:
我仍然得到" - 窗口类型2038的权限被拒绝"错误.截至目前我正在使用TYPE_PHONE并且它可以工作,但它已被弃用并且说要使用TYPE_APPLICATION_OVERLAY.有人可以对此进行跟进,因为TYPE_PHONE答案不是真正的解决方案,而是Android O中不推荐使用的"补丁工作"解决方案.
我在Android 7.1.2上运行
android.view.WindowManager $ BadTokenException:无法添加窗口android.view.ViewRootImpl$W@1f47e89 - android.app.ActivityThread上android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3344)的窗口类型2038的权限被拒绝.- wrap21(ActivityThread.java)位于android.app.AooT.Thread上的android.O. HandleMessage(Handler.java:102)上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1583).(Looper) .java:154)在android.app.ActivityThread.main(ActivityThread.java:6121)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit) .java:889)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)引起:android.view.WindowManager $ BadTokenException:无法添加窗口android.view.ViewRootImpl$W@1f47e89 - 在Android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)的android.view.ViewRootImpl.setView(ViewRootImpl.java:703)上的窗口类型2038的权限被拒绝 HeadService.TwoViewManager的android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93).(两个ViewManager.java:99)位于android.app.ActivityThread.handleServiceArgs(ActivityThread)的HeadService.UIHeadService.onStartCommand(UIHeadService.java:65). java:3327)在Android.app.Handler.dispatchMessage(Handler.java:102)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1583)的android.app.ActivityThread.-wrap21(ActivityThread.java)在android.os.Looper.loop(Looper.java:154)的android.app.ActivityThread.main(ActivityThread.java:6121),位于com.android.internal的java.lang.reflect.Method.invoke(Native Method) .os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
我有一个Android应用程序,它包含一个Button.
当您单击按钮时,应从相机捕获图像而不打开相机应用程序(图像应在后台捕获).
如何实现此功能?
任何建议都会有很大帮助.
非常感谢提前.
我已经看到: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" />是必要的。