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

Google Pay开发:如何将AutoResolveHelper.resolveTask()封装到新Activity Results API并取消onActivityResult处理?

当然可以!把Google Pay的AutoResolveHelper.resolveTask()适配到Activity Results API完全可行

我之前在做Google Pay集成的时候,就嫌onActivityResult()的逻辑太繁琐,特意研究过这个方案,亲测能完美替代旧的回调方式,彻底告别请求码和结果码的混乱。

具体实现步骤

1. 自定义ActivityResultContract

首先我们需要创建一个自定义的Contract,用来封装Google Pay的请求和结果解析逻辑——这是Activity Results API的核心,负责把请求参数转换成Intent,再把返回的结果转换成我们需要的PaymentData对象:

import android.app.Activity
import android.content.Context
import android.content.Intent
import com.google.android.gms.wallet.AutoResolveHelper
import com.google.android.gms.wallet.PaymentData
import androidx.activity.result.contract.ActivityResultContract

class GooglePayContract : ActivityResultContract<Task<PaymentData>, PaymentData?>() {
    override fun createIntent(context: Context, input: Task<PaymentData>): Intent {
        // 借助AutoResolveHelper创建需要启动的交互Intent
        return AutoResolveHelper.createIntentToResolveTask(context, input)
    }

    override fun parseResult(resultCode: Int, intent: Intent?): PaymentData? {
        // 根据返回的结果码解析出PaymentData
        return when (resultCode) {
            Activity.RESULT_OK -> AutoResolveHelper.getResultFromIntent(intent)
            // 处理取消或失败的情况,返回null让回调处理
            else -> null
        }
    }
}

2. 注册Activity Results Launcher

在你的Activity或Fragment里,注册刚才定义的Contract,同时编写结果回调逻辑——这里就不用再管onActivityResult()了,所有结果都会直接走到这个回调里:

import androidx.activity.result.ActivityResultLauncher

private val googlePayLauncher = registerForActivityResult(GooglePayContract()) { paymentData ->
    paymentData?.let {
        // 支付成功,处理返回的PaymentData
        processPaymentSuccess(it)
    } ?: run {
        // 支付被取消或者失败,做对应的提示或处理
        showPaymentFailureMessage()
    }
}

3. 发起Google Pay请求

当你构建好PaymentDataRequest并获取到Task<PaymentData>之后,直接调用launcher的launch()方法即可,剩下的就交给Activity Results API处理:

// 假设你已经初始化好PaymentsClient,并且构建了合法的PaymentDataRequest
val paymentDataRequest = buildPaymentDataRequest() // 你的自定义方法
val task = paymentsClient.loadPaymentData(paymentDataRequest)

// 发起请求,不用管requestCode!
googlePayLauncher.launch(task)

额外注意点

  • 如果Task<PaymentData>已经处于完成状态(比如不需要用户交互就能获取结果),launcher会直接触发回调,不会启动额外的Activity
  • 确保你的PaymentsClient配置正确,包括商户ID、环境(测试/生产)等核心参数
  • 如果需要处理更细粒度的错误,可以在parseResult()里针对不同的错误码返回对应的错误信息,而不是只返回null

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:52:35