Android集成Braintree+Google Pay:onActivityResult未触发求助
我帮你梳理下几个大概率导致这个问题的点,结合你的代码来看:
1. Fragment的onActivityResult回调依赖宿主Activity转发
你是在Fragment中实现的onActivityResult,但Google Pay的AutoResolveHelper.resolveTask传入的是getActivity(),这时候宿主Activity必须正确转发回调给Fragment。
如果你的宿主Activity重写了onActivityResult方法,但没有调用super.onActivityResult(requestCode, resultCode, data);,那么Fragment的onActivityResult根本收不到回调。先去检查宿主Activity的这个方法,确保super调用存在。
2. 改用Activity Result API替代旧的onActivityResult(推荐)
从AndroidX开始,旧的onActivityResult机制已经被废弃,Fragment中使用它很容易出现回调丢失的问题。换成ActivityResultLauncher会更可靠,不需要依赖Activity转发:
修改后的代码示例:
// 在Fragment的onCreate中初始化Launcher private ActivityResultLauncher<IntentSenderRequest> googlePayLauncher; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPaymentsClient = Wallet.getPaymentsClient( getActivity(), new Wallet.WalletOptions.Builder() .setEnvironment(WalletConstants.ENVIRONMENT_TEST) .build() ); // 初始化ActivityResultLauncher googlePayLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { switch (result.getResultCode()) { case Activity.RESULT_OK: if (result.getData() != null) { PaymentData paymentData = PaymentData.getFromIntent(result.getData()); String token = paymentData.getPaymentMethodToken().getToken(); // 拿到token后继续Braintree的支付流程 } break; case Activity.RESULT_CANCELED: // 用户取消支付 break; case AutoResolveHelper.RESULT_ERROR: Status status = AutoResolveHelper.getStatusFromIntent(result.getData()); // 处理错误,比如打印日志或提示用户 break; } } ); } // 替换原来的AutoResolveHelper.resolveTask调用 private void launchGooglePay() { PaymentDataRequest request = createPaymentDataRequest(); if (request != null) { Task<PaymentData> loadTask = mPaymentsClient.loadPaymentData(request); loadTask.addOnCompleteListener(task -> { if (task.isSuccessful()) { IntentSender intentSender = task.getResult().getIntentSender(); try { googlePayLauncher.launch( new IntentSenderRequest.Builder(intentSender).build() ); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } } else { // 处理支付数据加载失败的情况 } }); } }
3. 检查Google Pay请求的Tokenization参数
你的createPaymentDataRequest里,gatewayMerchantId填的是"replace me",这个必须换成Braintree提供的真实测试商户ID。如果参数错误,Google Pay的tokenization流程会失败,可能导致回调异常(虽然一般会返回RESULT_ERROR,但也可能出现无回调的情况)。
4. 确认Manifest的Google Pay配置是否完整
确保你的AndroidManifest.xml里配置了必要的meta-data和权限:
<!-- 必要权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 启用Google Pay API --> <meta-data android:name="com.google.android.gms.wallet.api.enabled" android:value="true" />
先按这几个步骤排查,最可能的问题是Fragment的回调转发或者旧API的兼容性问题,换成Activity Result API应该能解决大部分回调丢失的情况。
内容的提问来源于stack exchange,提问作者uma

