如何通过Android Java代码实现应用在MIUI悬浮窗运行?现有代码失效
MIUI悬浮窗权限申请代码修复方案
你的代码问题在于未指定正确的MIUI权限页面Action/组件名,MIUI不同版本的安全中心权限页面对应的Intent配置差异很大,直接跳转包名无法定位到正确页面。以下是适配多版本MIUI的可行方案:
方案1:多版本适配的权限跳转代码
替换原代码为以下逻辑,覆盖不同MIUI版本的权限页面路径:
private void requestMiuiOverlayPermission() { Intent intent = new Intent(); String packageName = getPackageName(); try { // 适配MIUI 8及以上主流版本 intent.setAction("miui.intent.action.APP_PERM_EDITOR"); intent.putExtra("extra_pkgname", packageName); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (ActivityNotFoundException e1) { try { // 适配早期MIUI版本 intent.setAction("android.intent.action.MAIN"); intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity"); intent.putExtra("extra_pkgname", packageName); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (ActivityNotFoundException e2) { // 兜底跳转系统应用详情页 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", packageName, null)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); SketchwareUtil.showMessage(getApplicationContext(), "请手动开启「显示悬浮窗」权限"); } } }
方案2:先校验权限状态再跳转
在申请权限前先检查是否已拥有悬浮窗权限,避免无效跳转:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { requestMiuiOverlayPermission(); // 调用上面的跳转方法 } else { // 权限已获取,执行你的悬浮窗创建逻辑 startFloatingWindow(); } } else { // Android 6.0以下无需动态申请,直接启动悬浮窗 startFloatingWindow(); }
关键注意事项
- MIUI的悬浮窗权限属于特殊权限,无法通过普通权限请求弹窗获取,必须跳转至系统设置页手动开启
- 部分MIUI 14+版本的权限路径可能再次变更,测试时需覆盖主流MIUI版本
- 若兜底方案仍无法跳转,可引导用户手动进入「设置-应用设置-权限管理-特殊权限-显示悬浮窗」开启
内容的提问来源于stack exchange,提问作者حسين العيدروس
相关产品推荐
相关产品推荐

