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

如何在handlePurchase中获取BillingClient?Google Billing问题求助

解决方法:在handlePurchase中获取BillingClient

看起来你刚接触Google Play Billing的开发,遇到的问题其实是变量作用域的小问题,别担心,很容易解决。

你的核心问题是:当前billingClient是MyPurchase方法里的局部变量,而且声明顺序不对,导致PurchasesUpdatedListener内部没法访问到它,进而无法传递给handlePurchase。下面给你两个实用的修复方案:


方案1:将billingClient转为类成员变量(推荐)

这种方式更符合面向对象的设计,能让类内部方法直接复用billingClient实例,不需要每次传递:

public class Billing {
    private Context context;
    private List<String> skuList;
    private BillingClient billingClient; // 新增类成员变量

    // 构造函数
    public Billing(Context context, List<String> skuList) {
        this.context = context;
        this.skuList = skuList;
    }

    // 回调接口
    public interface Callback{
        void onSkuDetailsList(BillingClient billingClient, List<SkuDetails> skuDetailsList);
        void onResponse(Purchase purchase);
        void onError();
    }

    public void MyPurchase(final Callback callback) {
        PurchasesUpdatedListener purchaseUpdateListener = new PurchasesUpdatedListener() {
            @Override
            public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {
                    for (Purchase purchase : purchases) {
                        callback.onResponse(purchase);
                        handlePurchase(purchase); // 无需再传billingClient
                    }
                } else {
                    callback.onError();
                }
            }
        };
        // 初始化类成员billingClient
        billingClient = BillingClient.newBuilder(context)
                .enablePendingPurchases()
                .setListener(purchaseUpdateListener)
                .build();
        
        // 别忘了启动计费服务连接!这一步你之前漏了
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                // 连接成功后可以查询商品详情等操作
            }

            @Override
            public void onBillingServiceDisconnected() {
                // 处理服务断开后的重连逻辑
            }
        });
    }

    // 改为非静态方法,直接使用类成员billingClient
    void handlePurchase(Purchase purchase) {
        // 示例:处理已购买商品的确认逻辑
        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED && !purchase.isAcknowledged()) {
            AcknowledgePurchaseParams params = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            billingClient.acknowledgePurchase(params, result -> {
                // 处理确认结果
            });
        }
    }
}

方案2:调整变量声明顺序,直接传入静态方法

如果你想保留handlePurchase的静态特性,只需要把billingClient的声明移到监听器前面,让监听器能访问到这个变量:

public void MyPurchase(final Callback callback) {
    // 先声明初始化billingClient,让后续的监听器能访问到
    final BillingClient billingClient = BillingClient.newBuilder(context)
            .enablePendingPurchases()
            .build();

    PurchasesUpdatedListener purchaseUpdateListener = new PurchasesUpdatedListener() {
        @Override
        public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {
                for (Purchase purchase : purchases) {
                    callback.onResponse(purchase);
                    handlePurchase(billingClient, purchase); // 现在可以正常传入了
                }
            } else {
                callback.onError();
            }
        }
    };

    billingClient.setListener(purchaseUpdateListener);
    billingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(BillingResult billingResult) {
            // 连接成功后的逻辑
        }

        @Override
        public void onBillingServiceDisconnected() {
            // 重连逻辑
        }
    });
}

static void handlePurchase(BillingClient billingClient, Purchase purchase) {
    // 这里可以正常使用传入的billingClient了
}

最后提醒一句:你的代码里之前没有调用startConnection,这会导致计费服务无法正常工作,一定要加上哦!

内容的提问来源于stack exchange,提问作者Glitch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:26:44