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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:32:42