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

如何使用React Native实现Android设备自动授予锁屏显示权限?

React Native 实现锁屏显示权限适配方案

首先明确:不存在自动静默授予锁屏显示权限的方法,所有合规应用(包括WhatsApp、Telegram)都是通过适配不同厂商ROM的权限逻辑,引导用户手动开启该权限实现的,以下是通用适配+MIUI专属适配的完整方案:

一、原生Android基础适配

先完成原生层的基础权限和逻辑配置,这是所有厂商设备适配的基础:

  • 在AndroidManifest.xml中添加必要权限声明:
<!-- 基础锁屏显示相关权限 -->
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.SHOW_WHEN_LOCKED" />
<!-- 高版本Android前台服务、通知权限 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  • 运行时权限判断:Android 10及以上版本,先调用Settings.canDrawOverlays(context)判断悬浮窗权限状态,未授权的情况下引导用户跳转至系统悬浮窗权限设置页开启,原生Android开启悬浮窗权限后会同步授予锁屏显示权限。
  • 给需要在锁屏弹出的Activity配置窗口标记,在Activity的onCreate方法中添加以下代码:
getWindow().addFlags(
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
);

二、MIUI专属适配方案

MIUI对锁屏显示权限做了独立管控,即便开启悬浮窗权限也不会自动授予锁屏显示权限,需要单独适配:

  • 第一步:在AndroidManifest.xml中添加MIUI专属权限声明:
<uses-permission android:name="miui.permission.SHOW_ON_LOCKSCREEN" />
  • 第二步:编写MIUI权限判断方法,通过反射调用MIUI权限管理接口判断权限状态:
public static boolean isMIUILockScreenPermissionGranted(Context context) {
    try {
        AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        // MIUI锁屏显示权限对应的固定op值
        int lockScreenOpCode = 10020;
        int checkResult = appOpsManager.checkOpNoThrow(lockScreenOpCode, android.os.Process.myUid(), context.getPackageName());
        return checkResult == AppOpsManager.MODE_ALLOWED;
    } catch (Exception e) {
        // 非MIUI系统返回false,走原生适配逻辑即可
        return false;
    }
}
  • 第三步:编写跳转方法,引导用户进入MIUI专属的锁屏显示权限设置页:
public static void jumpToMIUILockPermissionSetting(Context context) {
    try {
        Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
        intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
        intent.putExtra("extra_pkgname", context.getPackageName());
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    } catch (Exception e) {
        // MIUI不同版本权限页路径可能有差异,跳转失败时降级到应用通用权限设置页
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", context.getPackageName(), null);
        intent.setData(uri);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

三、React Native侧封装

将上述原生逻辑封装为原生模块,暴露以下方法给JS层调用即可:

  • checkLockScreenPermission():异步返回当前设备是否已经授予锁屏显示权限
  • requestLockScreenPermission():自动判断系统类型,跳转至对应的权限设置页
  • setActivityLockScreenDisplay(enable: boolean):给当前顶层Activity添加/移除锁屏显示的窗口标记

也可以直接使用社区成熟的第三方权限库扩展适配该能力,无需完全自实现原生模块。

内容的提问来源于stack exchange,提问作者Fatih Ateş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 23:24:04