Android 消费购买导致对象引用为空
计费流程成功启动,我收到了购买收据电子邮件Android 消费购买导致对象引用为空,android,in-app-billing,android-billing,play-billing-library,Android,In App Billing,Android Billing,Play Billing Library,计费流程成功启动,我收到了购买收据电子邮件 但是,当client.consumerasync(consumerparams,consumerresponseListener)时会发生致命错误被调用。 这是有问题的,因为这意味着购买尚未消费,无法再次购买 按钮点击: public void onClick5Handler(View view) { billingClient.launchBillingFlow(this, flowParams); } setupBill
但是,当
client.consumerasync(consumerparams,consumerresponseListener)时会发生致命错误代码>被调用。
这是有问题的,因为这意味着购买尚未消费,无法再次购买
按钮点击:
public void onClick5Handler(View view) {
billingClient.launchBillingFlow(this, flowParams);
}
setupBillingClient()是从onCreate()启动的,会导致成功连接:
public void setupBillingClient() {
billingClient = BillingClient.newBuilder(this).setListener(this).enablePendingPurchases().setListener(this).build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
Toast.makeText(CoinsActivity.this, "success" + billingResult.getResponseCode(), Toast.LENGTH_SHORT).show();
queryProducts();
} else
Toast.makeText(CoinsActivity.this, "failed" + billingResult.getResponseCode(), Toast.LENGTH_SHORT).show();
}
@Override
public void onBillingServiceDisconnected() {
Toast.makeText(CoinsActivity.this, "you are disconnected from billing", Toast.LENGTH_SHORT).show();
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
}
});
}
任何建议都将不胜感激。我认为您的客户机未初始化或为空。正确地检查它或添加整个代码以帮助您。我已经添加了剩余的代码。客户端应替换为billingClient。它引用了相同的东西-billingClient。我注意到的问题是购买列表为空,但我仍然得到响应代码:7 error,这没有意义。在运行onPurchasesUpdated之前,是否需要以某种方式查询采购?
public void queryProducts() {
List<String> skuList = new ArrayList<>();
skuList.add(COINS_5);
skuList.add(COINS_15);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
for (SkuDetails skuDetails : skuDetailsList) {
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
flowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList.get(0)).build();
if ("coins_5".equals(sku)) {
coins5Price = price;
} else if ("coins_15".equals(sku)) {
coins15Price = price;
}
}
}
}
});
}
@Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {
for (Purchase purchase : purchases) {
handlePurchase(purchase);
}
}
else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
}
else {
}
}
void handlePurchase(Purchase purchase) {
if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
// Grant entitlement to the user.
ConsumeParams consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
billingClient.consumeAsync(consumeParams, consumeResponseListener);
}
}