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

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里做结果转发:

  1. 先在你的插件类里暴露一个接收结果的公开方法:
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());
        });
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:01