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
相关产品推荐
相关产品推荐

