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

如何用Activity Result Launcher替代onActivityResult实现Google Pay推送配置

用Activity Result Launcher替代onActivityResult处理Google Pay Push Tokenize结果

你可以通过自定义Activity Result Contract来适配TapAndPayClient#pushTokenize()的场景,绕过已弃用的onActivityResult,具体实现步骤如下:

1. 自定义Activity Result Contract

创建一个继承自ActivityResultContract的类,封装pushTokenize()的调用逻辑,无需手动管理请求码:

import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.activity.result.contract.ActivityResultContract
import com.google.android.gms.tapandpay.PushTokenizeRequest
import com.google.android.gms.tapandpay.TapAndPayClient

class TapAndPayPushTokenizeContract : ActivityResultContract<Pair<TapAndPayClient, PushTokenizeRequest>, Intent?>() {
    override fun createIntent(context: Context, input: Pair<TapAndPayClient, PushTokenizeRequest>): Intent {
        val (tapAndPayClient, request) = input
        // 直接调用pushTokenize获取要启动的Activity Intent,内部已处理请求码关联
        return tapAndPayClient.pushTokenize(context, request)
    }

    override fun parseResult(resultCode: Int, intent: Intent?): Intent? {
        // 仅返回成功状态下的Intent,也可根据需求返回resultCode和Intent的组合
        return if (resultCode == Activity.RESULT_OK) intent else null
    }
}

2. 注册Activity Result Launcher

在你的Activity或Fragment中注册自定义的Launcher,并编写结果处理逻辑:

import android.app.Activity
import androidx.activity.result.ActivityResultLauncher
import com.google.android.gms.common.api.CommonStatusCodes
import com.google.android.gms.tapandpay.TapAndPayClient

private val pushTokenizeLauncher: ActivityResultLauncher<Pair<TapAndPayClient, PushTokenizeRequest>> =
    registerForActivityResult(TapAndPayPushTokenizeContract()) { resultIntent ->
        resultIntent?.let {
            val status = TapAndPayClient.getPushTokenizeResult(it)
            when (status.statusCode) {
                CommonStatusCodes.SUCCESS -> {
                    // 处理tokenize成功逻辑,比如获取token结果
                    val tokenResult = status.getTokenizationResult()
                }
                CommonStatusCodes.CANCELED -> {
                    // 用户取消操作
                }
                else -> {
                    // 处理错误情况,比如status.getStatusMessage()查看错误信息
                }
            }
        }
    }

3. 启动Push Tokenize流程

调用Launcher启动流程,无需手动传入请求码:

import com.google.android.gms.tapandpay.PushTokenizeRequest
import com.google.android.gms.tapandpay.TapAndPay

// 初始化TapAndPayClient和请求参数
val tapAndPayClient = TapAndPay.getClient(this)
val pushTokenizeRequest = PushTokenizeRequest.Builder()
    // 配置你的请求参数,比如paymentMethodToken、issuerName等
    .build()

// 启动流程
pushTokenizeLauncher.launch(tapAndPayClient to pushTokenizeRequest)

扩展:区分多组请求

如果需要同时处理多个不同的pushTokenize请求,可以修改Contract的输入为三元组,携带自定义标识:

// 修改Contract输入为Triple<TapAndPayClient, PushTokenizeRequest, Int>(Int为自定义请求标识)
class TapAndPayPushTokenizeContract : ActivityResultContract<Triple<TapAndPayClient, PushTokenizeRequest, Int>, Pair<Int, Intent?>>() {
    override fun createIntent(context: Context, input: Triple<TapAndPayClient, PushTokenizeRequest, Int>): Intent {
        val (tapAndPayClient, request, _) = input
        return tapAndPayClient.pushTokenize(context, request)
    }

    override fun parseResult(resultCode: Int, intent: Intent?, input: Triple<TapAndPayClient, PushTokenizeRequest, Int>): Pair<Int, Intent?> {
        // 返回自定义标识和结果Intent
        return input.third to (if (resultCode == Activity.RESULT_OK) intent else null)
    }
}

之后在Launcher回调中,根据返回的标识区分不同请求的结果即可。

内容的提问来源于stack exchange,提问作者Vahé Khachaturian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:55:15