Android中onActivityResult调用getStringExtra返回NULL问题求助
我尝试在onActivityResult中从URI Intent获取返回结果,但resultCode始终为-1(即RESULT_OK),Intent data却始终为null。相关代码如下:
启动目标Activity的代码
private fun startMyFunction(call: MethodCall) { val app: String? = call.argument("app") val url: String? = call.argument("url") try { val uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, uri) intent.setPackage(app) if (activity?.let { intent.resolveActivity(it.packageManager) } == null) { this.success("activity_unavailable") return } activity?.startActivityForResult(intent, requestCodeNumber) } catch (ex: Exception) { Log.e("my_app", ex.toString()) this.success("failed_to_open_app") } }
结果回调处理代码
private fun success(o: String) { if (!hasResponded) { hasResponded = true result?.success(o) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { if (requestCodeNumber == requestCode && result != null) { Log.d("onActivityResult - response - ", data.toString()) if (data != null) { try { val response = data.getStringExtra("response")!! this.success(response) } catch (ex: Exception) { this.success("invalid_response - Exception") } } else { this.success("user_cancelled - Null data") } } return true }
我已查阅相关案例但未能解决问题,参考了类似的UPI支付插件实现逻辑。
首先要明确一个核心点:resultCode为-1(RESULT_OK)只是说明目标Activity正常关闭了,但不代表它一定会返回data。结合你的代码,我整理了几个可能的问题点和解决方向:
1. 目标应用不支持返回数据
你使用的是Intent.ACTION_VIEW来启动目标应用,这个Action的核心用途是让应用查看指定URI的内容,而非完成操作后返回结果。大部分应用处理ACTION_VIEW时,不会主动设置setResult()来返回数据——它们只是打开内容,关闭时就正常结束,不会传递任何数据回来。
对比你参考的UPI支付插件:UPI类应用专门针对支付场景做了适配,会在支付完成后主动返回结果数据,所以插件能拿到data。但普通应用不一定有这个逻辑。
解决建议:
- 确认你调用的目标应用(
app参数指定的应用)是否支持通过Intent返回数据。可以查看该应用的官方文档,或者联系开发者确认是否有对应的回调机制。 - 如果目标应用没有返回数据的逻辑,那无论怎么调整你的代码,都拿不到
data,这时候需要考虑其他方案(比如使用该应用的SDK、或者通过其他方式获取状态)。
2. 替换废弃的startActivityForResult
startActivityForResult已经被Android官方废弃,推荐使用Activity Result API,它能避免一些兼容性问题(比如任务栈导致的回调异常)。
替换后的代码示例:
// 在类中初始化ActivityResultLauncher private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val data = result.data if (data != null) { try { val response = data.getStringExtra("response")!! this.success(response) } catch (ex: Exception) { this.success("invalid_response - Exception") } } else { this.success("user_cancelled - Null data") } } else { // 处理非RESULT_OK的情况,比如用户主动取消 this.success("operation_cancelled") } } // 修改启动逻辑为launch private fun startMyFunction(call: MethodCall) { val app: String? = call.argument("app") val url: String? = call.argument("url") try { val uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, uri) intent.setPackage(app) if (activity?.let { intent.resolveActivity(it.packageManager) } == null) { this.success("activity_unavailable") return } // 用launch替代startActivityForResult activityResultLauncher.launch(intent) } catch (ex: Exception) { Log.e("my_app", ex.toString()) this.success("failed_to_open_app") } }
3. 检查目标应用的Activity启动模式
如果目标应用的Activity设置了launchMode="singleTask"或singleInstance,可能会导致返回结果异常——因为这类启动模式会把Activity放在新的任务栈中,当前应用的onActivityResult可能无法正确接收到回调。
解决建议:
- 可以尝试给Intent添加
FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP(不过这可能改变目标应用的启动行为,需要测试):
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
- 但更稳妥的方式还是确认目标应用的启动模式,或者询问开发者是否有适配返回结果的方案。
4. 确认Intent的Action是否合适
如果你的需求是完成某个操作后获取结果,ACTION_VIEW可能不是最佳选择。有些应用会提供自定义的Action(比如com.example.app.ACTION_COMPLETE_TASK),专门用于触发操作并返回结果。
解决建议:
- 查找目标应用的Intent文档,确认是否有专门用于获取结果的Action,替换当前的
ACTION_VIEW。
内容的提问来源于stack exchange,提问作者Arun

