Android 计费库 v4 没有 return SKU 详细信息
Android Billing Library v4 does not return SKU details
我有一个 Android 应用已经发布在 Google Play 上。我现在正在尝试将计费库从 v2 更新到 v4。与 Google Play 的连接正常;但是,使用 BillingClient#querySkuDetailsAsync
获取 SKU 详细信息不会 return 任何东西。
我在 this post 中看到了类似的问题,但据我所知,建议的解决方案适用于尚未发布的应用程序。
另一个 建议使用 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 window (Activity#getWindow
) 设置进度条的可见性,它在异步回调中挂起;因此,该行之后的日志语句从未执行过。这让我天真地认为回调根本没有被执行过。
不过还有一件事:我收到了 BillingResponseCode
6,这是“API 操作期间的致命错误”。我将 AVD 更改为 Pixel 4 (API 30),现在我检索了 SKU 详细信息。
我有一个 Android 应用已经发布在 Google Play 上。我现在正在尝试将计费库从 v2 更新到 v4。与 Google Play 的连接正常;但是,使用 BillingClient#querySkuDetailsAsync
获取 SKU 详细信息不会 return 任何东西。
我在 this post 中看到了类似的问题,但据我所知,建议的解决方案适用于尚未发布的应用程序。
另一个 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 window (Activity#getWindow
) 设置进度条的可见性,它在异步回调中挂起;因此,该行之后的日志语句从未执行过。这让我天真地认为回调根本没有被执行过。
不过还有一件事:我收到了 BillingResponseCode
6,这是“API 操作期间的致命错误”。我将 AVD 更改为 Pixel 4 (API 30),现在我检索了 SKU 详细信息。