使用静态产品测试计费会返回 SERVICE_DISCONNECTED

Kri*_*s B 5 android android-billing

我正在将我的应用程序中的应用程序内结算从版本 3升级到更新的代码。版本 3 工作正常,现在在我的应用程序中生成,但我已经读到它最终将被弃用。

当我尝试使用静态产品 id (android.test.purchased)测试购买流程时,BillingResult结果代码仅返回 -1 并带有“服务连接已断开”的调试消息。AFAIK,较新的库中没有服务连接,但版本 3 中有。

如果我使用真正的应用内产品代码,它会告诉我我已经购买了它,这是正确的,但我需要测试实际的购买流程。

我正在实际设备(Pixel 3 XL)上测试此功能,而不是模拟器。我尝试在使用测试帐户(不是开发人员)登录的单独设备上对其进行测试,但得到了相同的结果。

更新:我在开发人员控制台中设置了一个真实的(测试)应用内托管产品,然后在使用测试(非开发人员)帐户登录的设备上安装了我的应用程序,但我仍然收到“服务连接是已断开”错误。我觉得这是代码之外的东西,但不确定是什么。

更新 2:我创建了一个新项目,除了计费代码之外什么都没有,并且它有效,所以我的应用程序中有一些东西导致它崩溃。

更新 3:我创建了一个新项目并将代码从损坏的应用程序导入到其中,但仍然收到相同的错误消息。我觉得,现在,我的包名称和 Google 服务器返回了错误消息。

更新 4:我创建了一个空白项目,但给它提供了与我损坏的应用程序相同的包名称,并且计费正常,所以它不是包名称。现在我的猜测是旧的 AIDL 计费代码(版本 3)中存在一些干扰。

解决方案!!!在我有这个application节点: 。删除了该属性,现在可以进行计费了。AndroidManifest.xmltools:node="replace"

    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)
                                        }
                                    }
                                }
                            }
                        });
        }
    });
Run Code Online (Sandbox Code Playgroud)

Kri*_*s B 0

这是 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>  
Run Code Online (Sandbox Code Playgroud)

删除tools:node="replace"修复了计费。希望这能挽救某人我浪费的日子。