如何在Android 10系统中创建悬浮窗并解决权限申请相关问题
Android 10 Core M01机型悬浮窗权限适配方案
前提校验
确认AndroidManifest.xml中已声明所需权限:
<!-- 悬浮窗基础权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 跳转权限设置页所需权限 --> <uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />
标准动态申请流程
Android 6.0及以上版本统一使用如下逻辑申请权限:
// 权限请求请求码常量 private const val OVERLAY_PERMISSION_REQ_CODE = 1001 // 权限判断与申请触发 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName")) startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE) } else { // 已有权限,直接初始化悬浮窗 } } // 权限申请结果校验 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == OVERLAY_PERMISSION_REQ_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 注意:不要依赖resultCode判断结果,部分定制ROM返回值不准,必须用canDrawOverlays实时校验 if (Settings.canDrawOverlays(this)) { // 权限授予成功 } } }
Core M01 Android 10 专属适配方案
该机型ROM对悬浮窗权限做了定制管控,存在默认拦截的情况,按以下步骤处理:
- 若标准申请流程跳转后看不到对应应用的权限开关,先引导用户手动开启悬浮窗总开关:设置 > 应用管理 > 特殊应用权限 > 显示在其他应用上层 > 右上角菜单 > 允许所有应用悬浮窗
- 若标准权限申请Intent被系统拦截,替换为跳转应用详情页的代码:
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) intent.data = Uri.parse("package:$packageName") startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE)
兜底方案
如果以上适配后仍无法获取权限,可优先使用应用内悬浮窗、通知栏提示、Toast等替代方案,保证核心功能可用。
内容的提问来源于stack exchange,提问作者Star4Droid
相关产品推荐
相关产品推荐

