You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:45:05