Android TV无法启动SYSTEM_ALERT_WINDOW设置及权限问题咨询
SYSTEM_ALERT_WINDOW权限相关问题解答
问题背景
我的应用完全依赖SYSTEM_ALERT_WINDOW权限运行,尝试通过以下代码申请该权限时应用崩溃:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getApplicationContext().getPackageName())); startActivityForResult(intent, 12);
崩溃日志如下:
Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.action.MANAGE_OVERLAY_PERMISSION dat=package:maa.tv.tools_app} at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1798) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1512) at android.app.Activity.startActivityForResult(Activity.java:3917) at android.app.Activity.startActivityForResult(Activity.java:3877)
测试环境:运行Android 23(Marshmallow)的Android TV
补充信息:
- 将TargetSDK从34改为16时,Android系统会自动授予权限,应用可正常运行,说明该权限在Android TV系统中存在。
- 使用adb命令
adb shell appops set maa.tv.tools_app SYSTEM_ALERT_WINDOW allow也可使应用正常运行。
核心问题
- 为什么上述申请权限的代码在Android 23的Android TV上崩溃?
- 当TargetSDK低于23时,Android系统是否会自动授予
SYSTEM_ALERT_WINDOW权限?请给出解释。
解答
1. 代码崩溃原因
Settings.ACTION_MANAGE_OVERLAY_PERMISSION对应的权限管理页面,在Android 23版本的Android TV系统中没有对应的Activity实现。Android TV的系统设置与手机版存在功能差异,部分手机端的权限管理入口在TV端并未提供,因此调用该Intent会触发ActivityNotFoundException。
2. 低TargetSDK版本的权限授予逻辑
当TargetSDK低于23时,Android系统确实会自动授予SYSTEM_ALERT_WINDOW权限,具体逻辑如下:
- 在Android 6.0(API 23)之前,Android采用"安装时授权"的权限模型:所有在Manifest中声明的权限,只要属于
NORMAL或DANGEROUS级别,都会在应用安装阶段自动授予,无需用户手动确认。 SYSTEM_ALERT_WINDOW在API 23之前被划分为NORMAL权限(API 23及之后被调整为需要用户手动授权的特殊权限),因此当应用的TargetSDK低于23时,系统会沿用旧版权限规则,自动为应用开启该权限。- 你将TargetSDK改为16后应用正常运行的情况,正好验证了这一规则——系统按照低版本权限逻辑自动授予了
SYSTEM_ALERT_WINDOW权限。
额外补充:对于Android TV设备,若需在TargetSDK≥23的场景下获取该权限,可通过adb命令预配置权限;若设备系统设置中存在对应权限入口,也可引导用户手动开启(需注意部分Android TV版本可能无该入口)。
内容的提问来源于stack exchange,提问作者user7954210
相关产品推荐
相关产品推荐

