Тестирование биллинга со статическими продуктами возвращает SERVICE_DISCONNECTED - PullRequest
1 голос
/ 27 мая 2019

Я обновляю биллинг в приложении в моем приложении с Версия 3 до более новый код . Версия 3 работает нормально, и сейчас она работает в моем приложении, но я читал, что со временем она устареет.

Когда я пытаюсь проверить поток покупок с использованием статического идентификатора продукта (android.test.purchased), код результата BillingResult возвращает только -1 с сообщением об отладке «Подключение к сервису отключено ». AFAIK, в новой библиотеке нет служебного соединения, но оно было в версии 3.

Если я использую реальный код продукта в приложении, он говорит, что я его уже приобрел, и это правильно, но мне нужно проверить фактический поток покупок.

Я тестирую это на реальном устройстве (Pixel 3 XL), а не на эмуляторе. Я пытался протестировать его на отдельном устройстве, которое вошло с тестовой учетной записью (не разработчиком), но я получаю те же результаты.

ОБНОВЛЕНИЕ: я установил настоящий (тестовый) управляемый в приложении продукт в консоли разработчика, затем установил свое приложение на устройство, которое вошло в систему с тестовой (не разработчиком) учетной записью, и я все еще получаю " Ошибка подключения службы. Я чувствую, что это что-то вне кода, но не уверен, что.

ОБНОВЛЕНИЕ 2: Я создал новый проект, в котором ничего не было, кроме биллингового кода, и он работал, поэтому в моем приложении есть что-то, что вызывает его поломку.

ОБНОВЛЕНИЕ 3: я создал новый проект и импортировал в него код из сломанного приложения, но все еще получаю то же сообщение об ошибке. Я чувствую, что что-то с именем моего пакета и серверами Google возвращает сообщение об ошибке.

ОБНОВЛЕНИЕ 4: Я создал пустой проект, но дал ему то же имя пакета, что и у моего сломанного приложения, и биллинг сработал, поэтому это не имя пакета. Теперь я думаю, что есть что-то из старого биллингового кода AIDL (версия 3), которое мешает.

РЕШЕНИЕ !!! Это имеет нулевой смысл, но в узле application в AndroidManifest.xml у меня было это: tools:node="replace". Убрал этот атрибут и биллинг теперь работает. WTF !!!!

    mBillingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build();
    mBillingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult.getResponseCode() == OK) {
                    final Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
                    if (purchasesResult.getResponseCode() == OK) {

                        final List<Purchase> purchases = purchasesResult.getPurchasesList();

                        for (final Purchase purchase : purchases) {
                        }
                    }
            }
        }
        @Override
        public void onBillingServiceDisconnected() {
            CommonUtils.showToast(mActivity, "disconnected");
        }
    });


    mUnlockPremiumButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

                final List<String> skuList = new ArrayList<> ();
                skuList.add(getString(R.string.inapp_premium_product_id));

                final SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder()
                    .setSkusList(skuList)
                    .setType(BillingClient.SkuType.INAPP);

                mBillingClient.querySkuDetailsAsync(params.build(),
                        new SkuDetailsResponseListener() {
                            @Override
                            public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {

                                for (SkuDetails skuDetails : skuDetailsList) {
                                    if (getString(R.string.inapp_premium_product_id).equals(skuDetails.getSku())) {

                                        final BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                                                .setSkuDetails(skuDetails)
                                                .build();

                                        final BillingResult result = mBillingClient.launchBillingFlow(mActivity, flowParams);

                                        if (result.getResponseCode() == ITEM_ALREADY_OWNED)
                                        {
                                            CommonUtils.showToast(mActivity, getString(R.string.alert_purchased));
                                        }
                                        else if (result.getResponseCode() != OK)
                                        {
                                            //always returns a getResponseCode of -1 (service disconnected)
                                        }
                                    }
                                }
                            }
                        });
        }
    });

1 Ответ

1 голос
/ 29 мая 2019

Это был узел приложения в AndroidManifest, когда биллинг ломался:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:node="replace">
    ...
</application>  

удаление tools:node="replace" исправило биллинг.Надеюсь, это спасет кого-то из тех дней, которые я потратил впустую.

...