react-native-permissions中如何区分RESULTS.DENIED的两种触发场景?
区分react-native-permissions中Android的两种RESULTS.DENIED场景
在react-native-permissions的Android权限流程里,RESULTS.DENIED会出现在两种场景:
- 应用首次调用
check()时,权限尚未被授予(用户从未被询问过该权限) - 用户手动拒绝权限,但未勾选"不再询问",权限仍可再次请求
要区分这两种场景,可以结合Android原生的权限判断逻辑,具体实现如下:
核心思路
利用Android系统提供的shouldShowRequestPermissionRationale方法,该方法的返回值可以帮我们判断用户的权限交互历史:
- 返回
false:用户从未被询问过该权限(对应首次未授予的场景) - 返回
true:用户已拒绝过一次权限,但未勾选"不再询问"(对应可再次请求的场景)
代码示例
import { PermissionsAndroid } from 'react-native'; import { check, RESULTS, PERMISSIONS } from 'react-native-permissions'; async function distinguishDeniedScenarios() { const permission = PERMISSIONS.ANDROID.CAMERA; const status = await check(permission); if (status === RESULTS.DENIED) { const shouldShowRationale = await PermissionsAndroid.shouldShowRequestPermissionRationale(permission); if (!shouldShowRationale) { // 场景1:首次调用check,权限未授予(用户从未收到权限请求弹窗) console.log("首次未授予权限,可直接发起请求"); } else { // 场景2:用户已拒绝过一次,仍可再次请求 console.log("用户已拒绝过权限,建议先展示权限用途说明再发起请求"); } } }
补充说明
当用户拒绝权限并勾选"不再询问"时,check()会返回RESULTS.BLOCKED,而非RESULTS.DENIED,这部分不需要额外区分。
内容的提问来源于stack exchange,提问作者gkeenley
相关产品推荐
相关产品推荐

