我有一个已经在Google Play上发布的Android应用程序。我现在正在尝试将计费库从v2更新到v4。连接Google Play运行良好;但是,使用BillingClient#querySkuDetailsAsync
获取SKU详细信息不会返回任何信息。
我在这篇文章中看到了一个类似的问题,但据我所见,建议的解决方案适用于尚未发布的应用程序。另一篇类似的帖子建议使用BillingClient.SkuType.SUBS
而不是BillingClient.SkuType.INAPP
。虽然这在我的情况下是错误的,但我仍然尝试过,但仍然没有得到任何结果。
以下是相关代码:
private BillingClientStateListener clientStateListener() {
return new BillingClientStateListener() {
@Override
public void onBillingServiceDisconnected() {
activity.logWarn("Billing service disconnected, trying again...");
// TODO try to reconnect
}
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if (isBillingResultSuccessful(billingResult, CONNECTING)) {
activity.logInfo("Successfully connected to billing service");
fetchSkuDetails();
}
}
};
}
private void fetchSkuDetails() {
activity.logInfo("Fetching SKU details...");
billingClient.querySkuDetailsAsync(
createSkuDetailsParams(),
(billingResult, skuDetailsList) -> {
activity.hideProgressBar();
activity.logInfo("Received SKU response. Billing result: %s, sku list size: %d",
billingResult, skuDetailsList.size());
if (isBillingResultSuccessful(billingResult, RETRIEVING_PRODUCTS)) {
addProducts(skuDetailsList);
skuResponseListener.onSkuDetailsResponse(skuDetailsList);
}
});
}
private SkuDetailsParams createSkuDetailsParams() {
List<String> skuList = new ArrayList<>(NUM_COIN_PRODUCTS);
for (int i = 1; i <= NUM_COIN_PRODUCTS; i++) {
skuList.add(PRODUCT_ID_PREFIX + i);
}
return SkuDetailsParams.newBuilder()
.setSkusList(skuList)
.setType(SkuType.INAPP)
.build();
}
我看到的最后一个日志条目是";正在获取SKU详细信息&";,但此后再也不会调用回调事件。我添加到SKU列表中的产品ID已经存在,并且应用内购买可以与我的生产应用程序一起使用。
可能是什么问题?
我找到了原因,我犯了一个简单愚蠢的错误。罪魁祸首是SkuDetailsResponseListener#onSkuDetailsResponse
:中的这一行
activity.hideProgressBar();
此方法试图通过使用UI窗口(Activity#getWindow
)来设置进度条的可见性,该窗口在异步回调中挂起;因此,该行之后的log语句从未执行过。这让我天真地认为回调根本没有执行过。
不过还有一件事:我收到了BillingResponseCode
6,它是";API操作期间发生致命错误&";。我将AVD更改为Pixel 4(API 30),现在检索SKU详细信息。