Android 系统覆盖 window 不工作
Android System Overlay window not working
我正在构建和 Android 应用程序,并尝试在此过程中尽我所能学习。作为测试,我想向系统添加 "chat heads" 样式覆盖。所以,我环顾四周,发现了一些很好的教程,以及一些非常好的答案,但它仍然无法正常工作。在我的 android 清单中,我有使用权限声明..
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然后在我的首选项页面中,当用户单击 SwitchPreference 以激活弹出式聊天时 window 我正在检查版本和权限,就像这样...
private Preference.OnPreferenceChangeListener chatHeadsChangeListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
if((boolean) o) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
!Settings.canDrawOverlays(getApplicationContext())) {
Intent intent = new Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName())
);
startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION);
} else {
initializeChatHeadsView();
}
}
return true;
}
};
然后在我的 onActivityResult 中,我再次检查以确保,就像我在此处找到的一个答案一样...
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CODE_DRAW_OVER_OTHER_APP_PERMISSION) {
if(Settings.canDrawOverlays(this)) {
initializeChatHeadsView();
} else {
Toast.makeText(
this,
"Draw over other app permission was not available. Cannot activate Popup Chat",
Toast.LENGTH_LONG
).show();
}
}
}
我第一次在模拟器上加载应用程序,即 运行 Android 8.0,我进入我的设置页面并单击 SwitchPreference 将其打开。设置页面打开询问我是否要启用权限,我激活了权限,但激活后它不会返回到我的应用程序,所以我点击返回到我的应用程序的后退按钮,然后我得到“[应用程序] 已停止响应。”如果我在 AndroidStudio 中检查日志,我会收到错误...
Process: test.notreal.justatext, PID: 21429
java.lang.RuntimeException: Unable to create service test.notreal.justatext.service.FloatingViewService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@bc855eb -- permission denied for window type 2002
所以它仍然说权限被拒绝,即使我启用了权限,并且在我的 onActivityResult 中我正在检查 if(Settings.canDrawOverlays())
谁能看出为什么会失败?我想不通。谢谢你的帮助,我真的很感激。
针对 Android 8.0
的应用
apps must use a new window type called TYPE_APPLICATION_OVERLAY.
所以对于 Android 8.0 你必须请求这个权限,对于较低的版本
SYSTEM_ALERT_WINDOW permission
会工作
更多请参考这个link
https://developer.android.com/about/versions/oreo/android-8.0-changes.html#cwt
我正在构建和 Android 应用程序,并尝试在此过程中尽我所能学习。作为测试,我想向系统添加 "chat heads" 样式覆盖。所以,我环顾四周,发现了一些很好的教程,以及一些非常好的答案,但它仍然无法正常工作。在我的 android 清单中,我有使用权限声明..
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然后在我的首选项页面中,当用户单击 SwitchPreference 以激活弹出式聊天时 window 我正在检查版本和权限,就像这样...
private Preference.OnPreferenceChangeListener chatHeadsChangeListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
if((boolean) o) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
!Settings.canDrawOverlays(getApplicationContext())) {
Intent intent = new Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName())
);
startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION);
} else {
initializeChatHeadsView();
}
}
return true;
}
};
然后在我的 onActivityResult 中,我再次检查以确保,就像我在此处找到的一个答案一样...
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CODE_DRAW_OVER_OTHER_APP_PERMISSION) {
if(Settings.canDrawOverlays(this)) {
initializeChatHeadsView();
} else {
Toast.makeText(
this,
"Draw over other app permission was not available. Cannot activate Popup Chat",
Toast.LENGTH_LONG
).show();
}
}
}
我第一次在模拟器上加载应用程序,即 运行 Android 8.0,我进入我的设置页面并单击 SwitchPreference 将其打开。设置页面打开询问我是否要启用权限,我激活了权限,但激活后它不会返回到我的应用程序,所以我点击返回到我的应用程序的后退按钮,然后我得到“[应用程序] 已停止响应。”如果我在 AndroidStudio 中检查日志,我会收到错误...
Process: test.notreal.justatext, PID: 21429
java.lang.RuntimeException: Unable to create service test.notreal.justatext.service.FloatingViewService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@bc855eb -- permission denied for window type 2002
所以它仍然说权限被拒绝,即使我启用了权限,并且在我的 onActivityResult 中我正在检查 if(Settings.canDrawOverlays())
谁能看出为什么会失败?我想不通。谢谢你的帮助,我真的很感激。
针对 Android 8.0
的应用apps must use a new window type called TYPE_APPLICATION_OVERLAY.
所以对于 Android 8.0 你必须请求这个权限,对于较低的版本
SYSTEM_ALERT_WINDOW permission
会工作
更多请参考这个link
https://developer.android.com/about/versions/oreo/android-8.0-changes.html#cwt