如何使用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ş
相关产品推荐
相关产品推荐

