React Native模块调用自定义Activity时onActivityResult无法获取返回数据
问题根因
你代码里存在3个核心错误导致onActivityResult无法触发/收不到数据:
- 调用
startActivityForResult时参数传位错误:该方法第二个参数是自定义请求码,你错误传入了RESULT_OK(这是返回结果的状态码,不是请求码),导致返回结果时无法匹配到对应回调 onActivityResult里取值逻辑错误:你往Intent里存的是Extra额外参数,但你错误调用data.data获取内容,data.data对应的是Intent的Uri数据,不是你存的额外参数- 重复注册
ActivityEventListener:每次调用openNativeVideoEditor都执行一次注册,会导致重复回调、内存泄漏问题
修复步骤
第一步:修改VideoEditorModule代码
- 先定义一个全局的自定义请求码常量
- 修正
startActivityForResult的传参 - 修正
onActivityResult的取值逻辑 - 把
ActivityEventListener的注册移到模块初始化方法,避免重复注册 - 回调完成后处理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
相关产品推荐
相关产品推荐

