如何在React Native Android原生模块中使用onRequestPermissionsResult处理权限?
在React Native Android原生模块内监听onRequestPermissionsResult的实现方案
当然可以!就像你提到的处理onActivityResult的思路一样,我们可以通过给ReactApplicationContext注册ActivityEventListener来在模块内部直接捕获权限请求的回调,完全不需要修改项目的MainActivity或者依赖PermissionsAndroid。
下面我结合你给出的代码,给你完整的实现示例:
首先,修改你的NativeModule类,让它实现ActivityEventListener接口,然后在构造函数里把自己注册为活动监听器:
import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.Manifest; import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; public class NativeModule extends ReactContextBaseJavaModule implements ActivityEventListener { private static final int PERMISSION_REQUEST_CODE = 1001; // 自定义唯一请求码,避免冲突 private Promise mPermissionPromise; // 用来保存权限请求的Promise,后续回调用 public NativeModule(ReactApplicationContext reactContext) { super(reactContext); // 注册Activity事件监听器 reactContext.addActivityEventListener(this); } @Override public String getName() { return "NativeModule"; // 模块名称,JS端会通过这个名字调用 } @ReactMethod public void requestPermissions(Promise promise) { Activity currentActivity = getCurrentActivity(); if (currentActivity == null) { promise.reject("NO_ACTIVITY", "无法获取当前Activity,请确保App处于前台状态"); return; } // 替换成你需要申请的权限数组 String[] targetPermissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; mPermissionPromise = promise; currentActivity.requestPermissions(targetPermissions, PERMISSION_REQUEST_CODE); } // 实现ActivityEventListener的三个方法 @Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { // 这里如果不需要处理页面跳转的结果,可以留空,但必须实现这个方法 } @Override public void onNewIntent(Intent intent) { // 同上,不需要的话留空即可 } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 只处理我们自己发起的权限请求 if (requestCode == PERMISSION_REQUEST_CODE && mPermissionPromise != null) { boolean allPermissionsGranted = true; // 检查所有权限的授权结果 for (int grantResult : grantResults) { if (grantResult != PackageManager.PERMISSION_GRANTED) { allPermissionsGranted = false; break; } } if (allPermissionsGranted) { mPermissionPromise.resolve("所有权限已授权"); } else { mPermissionPromise.reject("PERMISSION_DENIED", "部分或全部权限被拒绝"); } // 清空Promise,避免内存泄漏 mPermissionPromise = null; } } }
关键说明:
- ActivityEventListener接口:这个接口包含了
onRequestPermissionsResult、onActivityResult和onNewIntent三个回调方法,通过reactContext.addActivityEventListener(this)注册后,当宿主Activity收到对应的系统回调时,会自动调用我们模块里的这些方法。 - 请求码唯一性:一定要确保
PERMISSION_REQUEST_CODE是唯一的,建议使用1000以上的数值,避免和RN框架内部或其他第三方模块的请求码冲突。 - Activity为空处理:调用
getCurrentActivity()可能返回null(比如App在后台时),一定要做判空处理,避免空指针异常。 - Promise内存管理:在回调完成后要及时清空
mPermissionPromise,防止内存泄漏。
这样实现后,你在JS端调用NativeModule.requestPermissions()就能直接获取权限申请的结果,所有权限处理逻辑都封装在你的原生模块内部,完全符合你的需求。
内容的提问来源于stack exchange,提问作者computerman
相关产品推荐
相关产品推荐

