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

Google Pay AutoResolveHelper适配registerForActivityResult咨询

问题结论

你没有遗漏官方适配文档,截至当前最新的Google Play服务Wallet组件版本,AutoResolveHelper确实未提供面向registerForActivityResult()的原生适配API,其公开方法resolveTask(Task, Activity, int)的设计逻辑仍然默认将结果回调至Activity的onActivityResult方法,官方公开集成指南暂未更新对应新API的适配内容。
你不需要为了这个场景在项目中保留已废弃的onActivityResult重写逻辑,通过自定义Activity Result契约的兼容方案,可以完全基于新的Activity Result API完成Google Pay集成,无任何侵入性。

具体适配实现
  • 第一步:自定义专用的ActivityResultContract,用于承接AutoResolveHelper的返回结果
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContract
import com.google.android.gms.tasks.Task
import com.google.android.gms.wallet.PaymentData

class WalletAutoResolveContract : ActivityResultContract<Task<PaymentData>, ActivityResult>() {
    override fun createIntent(context: Context, input: Task<PaymentData>): Intent {
        // 无需手动构造跳转Intent,AutoResolveHelper会在内部完成页面拉起逻辑
        return Intent()
    }

    override fun parseResult(resultCode: Int, intent: Intent?): ActivityResult {
        return ActivityResult(resultCode, intent)
    }
}
  • 第二步:在Activity/Fragment中注册结果回调,获取系统自动分配的合法requestCode
import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.wallet.AutoResolveHelper
import com.google.android.gms.wallet.PaymentData
import com.google.android.gms.wallet.PaymentDataRequest
import com.google.android.gms.wallet.PaymentsClient

class PayActivity : AppCompatActivity() {
    private lateinit var paymentResultLauncher: ActivityResultLauncher<Task<PaymentData>>
    private var resolveRequestCode: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 注册支付结果回调
        paymentResultLauncher = registerForActivityResult(WalletAutoResolveContract()) { result ->
            when (result.resultCode) {
                RESULT_OK -> {
                    val paymentData = PaymentData.getFromIntent(result.data)
                    // 处理支付成功逻辑,提取支付令牌提交给服务端
                }
                RESULT_CANCELED -> {
                    // 处理用户主动取消支付的逻辑
                }
                AutoResolveHelper.RESULT_ERROR -> {
                    val status = AutoResolveHelper.getStatusFromIntent(result.data)
                    // 处理支付流程错误逻辑
                }
            }
        }
        // 获取系统为当前launcher分配的唯一requestCode,避免与其他业务请求冲突
        resolveRequestCode = paymentResultLauncher.contract.hashCode()
    }
}
  • 第三步:触发支付流程时,将获取到的系统分配requestCode传入AutoResolveHelper.resolveTask即可
private fun launchGooglePayFlow(paymentsClient: PaymentsClient, paymentDataRequest: PaymentDataRequest) {
    val paymentTask = paymentsClient.loadPaymentData(paymentDataRequest)
    AutoResolveHelper.resolveTask(
        paymentTask,
        this,
        resolveRequestCode
    )
}
方案说明
  • 该方案完全基于公开API实现,没有使用任何非公开接口,不存在版本兼容风险。其核心原理是复用Activity Result API内部的requestCode分发机制:系统为每个注册的ActivityResultLauncher分配唯一requestCode,当对应结果返回时自动路由到绑定的回调中,不需要依赖废弃的onActivityResult全局重写。
  • 该方案对现有业务逻辑改动极小,后续如果Google官方推出Wallet组件对Activity Result API的原生支持,仅需替换对应Contract即可完成迁移,不需要重构核心支付逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:27:16