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

