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

