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 详细信息。