Capacitor Android插件如何获取可触发插件内onActivityResult的Activity
问题根本原因
你当前直接将getActivity()获取到的MainActivity实例传给Google Pay SDK发起支付,SDK内部是用这个Activity实例调用系统startActivityForResult,所以结果自然只会回调到MainActivity的onActivityResult,不会路由到你的插件实例。Capacitor有自己的Result路由机制,只有通过插件自身提供的API启动的Activity,结果才会分发到插件的onActivityResult方法。
正确实现步骤
情况1:SDK支持获取待启动的Intent(优先使用)
大部分支付类SDK都会提供获取待启动Intent的接口,你可以拿到Intent后调用插件的startActivityForResult方法触发,即可自动接收回调:
public class GooglePayPlugin extends Plugin { private static final int REQUEST_CODE_GOOGLE_PAY = 9001; // 自定义请求码 private GooglePayClient googlePayClient; private GooglePayRequest googlePayRequest; public void init(PluginCall call){ // 先初始化SDK参数,不要直接传Activity发起请求 googlePayClient = new GooglePayClient(); googlePayRequest = buildGooglePayRequest(call); // 从SDK获取要启动的Intent Intent paymentIntent = googlePayClient.getPaymentIntent(getContext(), googlePayRequest); // 调用插件自带的startActivityForResult,结果会自动回调到插件自身的onActivityResult startActivityForResult(call, paymentIntent, REQUEST_CODE_GOOGLE_PAY); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_GOOGLE_PAY) { googlePayClient.onActivityResult(resultCode, data, (paymentMethodNonce, error) -> { if (error != null) { // 处理错误,返回给前端 call.reject(error.getMessage()); return; } // 处理成功逻辑 call.resolve(paymentMethodNonce.getString()); }); } } }
情况2:SDK必须传入Activity才能发起请求
如果SDK没有提供获取Intent的接口,必须传Activity触发,就需要在MainActivity里做结果转发:
- 先在你的插件类里暴露一个接收结果的公开方法:
public class GooglePayPlugin extends Plugin { public static final String PLUGIN_NAME = "GooglePayPlugin"; private GooglePayClient googlePayClient; private PluginCall currentCall; public void init(PluginCall call){ this.currentCall = call; Activity activity = getActivity(); googlePayClient.requestPayment(activity, googlePayRequest, (success, error) -> { if (error != null) { call.reject(error.getMessage()); } }); } // 暴露公开方法给MainActivity调用转发结果 public void handlePaymentResult(int resultCode, Intent data) { googlePayClient.onActivityResult(resultCode, data, (paymentMethodNonce, error) -> { if (error != null) { currentCall.reject(error.getMessage()); return; } currentCall.resolve(paymentMethodNonce.getString()); }); } }
- 在MainActivity的
onActivityResult里拿到你的插件实例,转发结果:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 从Capacitor的插件管理器获取你的插件实例 GooglePayPlugin googlePayPlugin = (GooglePayPlugin) this.getBridge().getPlugin(GooglePayPlugin.PLUGIN_NAME); if (googlePayPlugin != null) { googlePayPlugin.handlePaymentResult(resultCode, data); } }
额外注意事项
- 不要在插件里长期持有Activity实例,避免内存泄漏,需要用的时候直接调用
getActivity()获取即可 getContext()方法可以拿到可用的Context实例,大部分不需要Activity的场景用Context就足够- 调用
startActivityForResult时要传入当前的PluginCall实例,这样Capacitor会自动关联请求和对应的插件实例
内容的提问来源于stack exchange,提问作者uneasy
相关产品推荐
相关产品推荐

