web-dev-qa-db-ja.com

Google Play Billing Library - QuerySkudetailSASyncは、allingResponseCode.error(6)を返します。

私はを使っていますGoogle Play Billing Library 2.0.3(_implementation 'com.Android.billingclient:billing:2.0.3'_)(_public interface QuerySkuDetailsListener { void onSuccess(List<SkuDetails> skuDetailsList); void onErrorProductsHaveDifferentTypes(); void onBillingClientError(int error_code); } public void querySkuDetails(final QuerySkuDetailsListener querySkuDetailsListener, final Product... products) { if (products.length < 1) { //ERROR_NO_PRODUCTS_TO_QUERY throw new NullPointerException(); } String querySkuType = products[0].getSkuType(); SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); List<String> skuList = new ArrayList<>(); for (Product product : products) { skuList.add(product.getSku()); if (!product.getSkuType().equals(querySkuType)) { //ERROR_SKU_TYPE_CANT_BE_DIFFERENT querySkuDetailsListener.onErrorProductsHaveDifferentTypes(); return; } } params.setSkusList(skuList).setType(querySkuType); billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) { querySkuDetailsListener.onSuccess(skuDetailsList); } else { //ERROR QUERYING SKU DETAILS querySkuDetailsListener.onBillingClientError(billingResult.getResponseCode()); } } }); } _)では、ほとんどの場合、一部のユーザーが不明な理由、querySkuDetailsAsync() method occasionally fails with BillingResponseCode.ERROR (6) error code...

誰かがそれについて何も知っていますか?このエラーの理由はどこにも説明されていません。これ以外は「APIアクション中の致命的なエラー」です。誰かがなぜそれが起こっているかもしれない理由を知ることができますか?

編集:マニュアルのようにメソッドを使用しています( https://developer.android.com/google/play/)。請求/ Billing_Library_OverView ):

_        private void initiatePurchaseFlow(final Activity activity, @Nullable final Product oldProduct, final Product product, final JsonObject metadata, final InitiatePurchaseListener initiatePurchaseListener) {

                //Check if billingClient is ready
                if (billingClient.isReady()) {
                    querySkuDetails(new QuerySkuDetailsListener() {
                            @Override
                            public void onSuccess(List<SkuDetails> skuDetailsList) {
                                // Process the result.
                                BillingFlowParams.Builder flowParamsBuilder = BillingFlowParams.newBuilder();
                                flowParamsBuilder.setSkuDetails(skuDetailsList.get(0));
                                if (null != oldProduct) {
                                    flowParamsBuilder.setOldSku(oldProduct.getSku());
                                    flowParamsBuilder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION);
                                }
                                BillingFlowParams flowParams = flowParamsBuilder.build();
                                int responseCode = billingClient.launchBillingFlow(activity, flowParams).getResponseCode();
                                if (responseCode == BillingClient.BillingResponseCode.OK) {
                                    //SUCCESS, OK
                                    ...Rest of the irrelevant code...
                                }
                                else {
                                    //ERROR_IN_LAUNCHING_BILLING_FLOW
                                    dispenseInitiatePurchaseFlowError(activity, initiatePurchaseListener, InitiatePurchaseErrorCodes.ERROR_IN_LAUNCHING_BILLING_FLOW, getBillingClientErrorDescription(responseCode));
                                }
                            }

                            @Override
                            public void onErrorProductsHaveDifferentTypes() {
                                //ERROR_IN_QUERYING_SKU_DETAILS_PRODUCTS_HAVE_DIFFERENT_TYPES
                                dispenseInitiatePurchaseFlowError(activity, initiatePurchaseListener, InitiatePurchaseErrorCodes.ERROR_IN_QUERYING_SKU_DETAILS_PRODUCTS_HAVE_DIFFERENT_TYPES, getBillingClientErrorDescription(0));
                            }

                            @Override
                            public void onBillingClientError(int error_code) {
                                //ERROR_IN_QUERYING_SKU_DETAILS
                                dispenseInitiatePurchaseFlowError(activity, initiatePurchaseListener, InitiatePurchaseErrorCodes.ERROR_IN_QUERYING_SKU_DETAILS, getBillingClientErrorDescription(error_code));
                            }
                        }, product);
                }
                else {
                    //ERROR_BILLING_CLIENT_IS_NOT_READY
                    //Trying to reconnect once          
                    billingClient.startConnection(new BillingClientStateListener() {
                        @Override
                        public void onBillingSetupFinished(BillingResult billingResult) {
                            if (billingResult.getResponseCode() == BillingResponse.OK) {
                                //launching again
                                initiatePurchaseFlow(activity, oldProduct, product, metadata, initiatePurchaseListener);
                            }
                            else {
                            // showing an error dialog
                            dispenseInitiatePurchaseFlowError(activity, initiatePurchaseListener, InitiatePurchaseErrorCodes.ERROR_BILLING_CLIENT_IS_NOT_READY, getBillingClientErrorDescription(billingResult.getResponseCode()));
                            }
                        }
                        @Override
                        public void onBillingServiceDisconnected() {
                            // showing an error dialog
                        }
                    });
                }
            }
_

それから私はこのようにそれを使います:

_BillingResponseCode.ERROR_

編集:ユーザーは単にカンニングできますか?例えば購入にめちゃくちゃになっているひびの入ったGoogle Play Store /その他のソフトウェアを使用してください。私がしていて、私がしていても、私がこのエラーが発生していないからです。

編集:これまでのところ、請求クライアントのonPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases)メソッドはこのエラーコードを返します(__(somebode)__)。あなたはアプリケーションを解読するためにラッキーパッチャーを使いますが、私はquerySkuDetailsAsync()...にエラーを得ていませんでした。

編集:もGoogle IssueTrackerに問題を作成しました。 https://issuetracker.google.com/issues/139631105

14
Redbu11

将来の参考とこれに苦しんでいる他の人々のために(iab 3.0.1で私のように)、opがオープンした問題のトラッカーのバグのバグの誰かがこのコードを受け取った場合に反応する方法についてのコメントを投稿しました

エラー6( https://developer.android.com/reference/com/android/billingclient/api/billingclient.billingResponseCode.#Error )通常はバックエンドサーバからの過渡エラー。このエラーコードは、ほとんどの場合に成功する必要があるリトライをトリガする必要があります。

リンク: https://issuetracker.google.com/issues/139631105#コメント11

コード例:

@Override
public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
    Utils.log("BILLING: onSkuDetailsResponse(). Result (" + billingResult.getResponseCode() + ") List size: " + (list == null ? "null" : list.size()));
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null) {
        if (mSkuQueryErrorCounter > 0) mSkuQueryErrorCounter--;
        // process the SkuDetail list...
        }
    } else {
        // https://issuetracker.google.com/issues/139631105#comment11
        mSkuQueryErrorCounter++;
        if (mSkuQueryErrorCounter <= 2) scheduleUpdate(NOW);
        else if (mSkuQueryErrorCounter < 5) scheduleUpdate(TEN_SECONDS);
        else if (mSkuQueryErrorCounter < 10) scheduleUpdate(ONE_HOUR);
        else scheduleUpdate(ONE_DAY);
    }
}
 _
1
BamsBamx