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

React Native模块调用自定义Activity时onActivityResult无法获取返回数据

问题根因

你代码里存在3个核心错误导致onActivityResult无法触发/收不到数据:

  • 调用startActivityForResult时参数传位错误:该方法第二个参数是自定义请求码,你错误传入了RESULT_OK(这是返回结果的状态码,不是请求码),导致返回结果时无法匹配到对应回调
  • onActivityResult里取值逻辑错误:你往Intent里存的是Extra额外参数,但你错误调用data.data获取内容,data.data对应的是Intent的Uri数据,不是你存的额外参数
  • 重复注册ActivityEventListener:每次调用openNativeVideoEditor都执行一次注册,会导致重复回调、内存泄漏问题

修复步骤

第一步:修改VideoEditorModule代码

  1. 先定义一个全局的自定义请求码常量
  2. 修正startActivityForResult的传参
  3. 修正onActivityResult的取值逻辑
  4. 把ActivityEventListener的注册移到模块初始化方法,避免重复注册
  5. 回调完成后处理promise,避免内存泄漏

修复后代码:

class VideoEditorModule(reactContext: ReactApplicationContext) 
    : ReactContextBaseJavaModule(reactContext), ActivityEventListener {

    // 自定义请求码,只要是唯一的int值即可
    private val REQUEST_CODE_VIDEO_EDIT = 1001
    private var modulePromise: Promise? = null

    // 模块初始化时注册一次监听器即可
    init {
        reactContext.addActivityEventListener(this)
    }

    override fun getName(): String {
        return "VideoEditorModule"
    }

    override fun onActivityResult(
        activity: Activity,
        requestCode: Int,
        resultCode: Int,
        data: Intent?
    ) {
        // 先匹配请求码,确认是我们发起的编辑请求的返回
        if (requestCode == REQUEST_CODE_VIDEO_EDIT) {
            if (resultCode == Activity.RESULT_OK && data != null) {
                // 取你存在Extra里的结果
                val resultUri = data.getStringExtra("Resulted")
                Log.d("ReactModule", "onActivityResult 拿到结果:$resultUri")
                modulePromise?.resolve(resultUri)
            } else {
                modulePromise?.reject("EDIT_CANCEL", "用户取消编辑")
            }
            modulePromise = null
        }
    }

   override fun onNewIntent(intent: Intent?) {
    val data = intent?.data
    Log.d("ReactModule", "onNewIntent: " + data.toString())
   }

   @ReactMethod
   fun openNativeVideoEditor(videoURL: String, promise: Promise) {
    val currentActivity = currentActivity;

    if (currentActivity == null) {
        promise.reject("ERROR_ACTIVITY", "Activity doesn't exist");
        return;
    }

    modulePromise = promise
    
    val intent = Intent(currentActivity, VideoEditorActivity::class.java)
    intent.putExtra("videoURL", videoURL)
    
    try {
        // 第二个参数传我们定义的自定义请求码,第三个参数传null没问题
        currentActivity.startActivityForResult(intent, REQUEST_CODE_VIDEO_EDIT, null)
    } catch (e: Exception) {
        promise.reject("ERROR_ACTIVITY", e);
        modulePromise = null;
    }
   }

   // 模块销毁时移除监听器,避免内存泄漏
   override fun onCatalystInstanceDestroy() {
       super.onCatalystInstanceDestroy()
       reactApplicationContext.removeActivityEventListener(this)
   }

}

第二步:可选优化VideoEditorActivity代码

你当前的取intent逻辑没问题,不过建议新建一个Intent返回,避免修改原启动Intent的参数:

class VideoEditorActivity: AppCompatActivity(), OnEditVideoListener {
    ...

    override fun getResult(uri: Uri) {
        Log.d("VideoEditorActivity", "getResult ${uri.path}")
        // 新建Intent存返回结果,不需要用启动时的intent
        val resultIntent = Intent()
        resultIntent.putExtra("Resulted", uri.path)
        setResult(Activity.RESULT_OK, resultIntent)
        finish()
    }
}

内容的提问来源于stack exchange,提问作者Robson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:45:03