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

