安卓内购代码出现NullPointerException问题求助
安卓内购BillingClient空指针异常解决方案
错误详情
NullPointerException: Attempt to invoke virtual method 'void com.android.billingclient.api.BillingClient.startConnection(com.android.billingclient.api.BillingClientStateListener)' on a null object reference
核心原因
你在onCreate方法中重新定义了局部变量BillingClient billingClient,覆盖了类的全局成员变量,导致全局的billingClient始终未完成初始化,调用establishConnection()时触发空指针异常。
修复步骤
1. 修正BillingClient初始化代码
将onCreate中的局部变量声明移除,直接给全局变量赋值:
// 原错误代码 // BillingClient billingClient = BillingClient.newBuilder(this)... // 修改后 billingClient = BillingClient.newBuilder(this) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build();
2. 修复其他潜在问题
除了空指针,你的代码还有几处需要完善的地方,避免后续报错:
- 初始化
productDetails:botonComprar方法依赖的productDetails未赋值,需在showProducts的回调中填充:
public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !productDetailsList.isEmpty()) { productDetails = productDetailsList.get(0); } }
- 初始化
prefs:全局prefs变量未初始化,在onCreate中添加:
prefs = new Prefs(this); // 根据你的Prefs类构造方法调整参数
- 统一产品类型:
onResume中查询的是INAPP类型,但商品定义为SUBS(订阅),需保持一致:
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.SUBS).build(), (billingResult, list) -> { // 原有逻辑 } );
- 完善购买结果监听:补全
PurchasesUpdatedListener的逻辑,处理购买成功的情况:
@Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { handlePurchase(purchase); } } }
内容的提问来源于stack exchange,提问作者BichitoGris
相关产品推荐
相关产品推荐

