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

Android中onActivityResult调用getStringExtra返回NULL问题求助

问题:onActivityResult中resultCode为-1但Intent data始终为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:25:25