首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用静态产品测试计费返回SERVICE_DISCONNECTED

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

Stack Overflow用户
提问于 2019-05-28 04:24:47
回答 2查看 1.5K关注 0票数 4

我正在将我的应用程序中的应用内计费从Version 3升级到newer code。版本3运行良好,目前在我的应用程序中生产,但我读到它最终将被弃用。

当我尝试使用static product id (android.test.purchased)测试购买流时,BillingResult结果代码仅返回-1以及调试消息"Service connection is disconnected“。AFAIK,在较新的库中没有服务连接,但在版本3中有。

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

我是在一个实际的设备(Pixel3XL)上测试的,而不是在模拟器上。我尝试在一个单独的设备上测试它,该设备是使用测试帐户(而不是开发人员)登录的,但我得到了相同的结果。

更新:我在开发者控制台中设置了一个真实的(测试)应用内托管产品,然后在使用测试(非开发者)帐户登录的设备上安装了我的应用,但我仍然收到"Service connection is disconnected“错误。我觉得这是代码之外的东西,但不确定是什么。

更新2:我创建了一个新项目,除了帐单代码之外什么都没有,它起作用了,所以我的应用程序中有什么东西导致了它崩溃。

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

更新4:我创建了一个空白项目,但给它起的包名和我坏掉的应用程序的包名是一样的,计费也没问题,所以它不是包名。现在我的猜测是,旧的AIDL计费代码(版本3)中有一些干扰。

解决方案!在AndroidManifest.xmlapplication节点中,我有以下内容:tools:node="replace"。删除了该属性,计费现在可以正常工作了。

代码语言:javascript
复制
    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)
                                        }
                                    }
                                }
                            }
                        });
        }
    });
EN

回答 2

Stack Overflow用户

发布于 2020-08-10 07:34:19

该错误清楚地表明,由于以下可能的原因,计费客户端会断开连接。

  1. 您已启动连接,但连接尚未完成设置。由于startConnection是异步进程,因此可能存在争用情况。您可以使用billingClient.isReady()检查它是否可用。

  1. 您的应用程序可能在启动后失去了连接/互联网。

  1. 您的设备/模拟器不支持

Play服务。

以下是针对SDK 28的Android版本的计费API 3.0中的工作代码。如计费接口错误处理部分(https://developer.android.com/google/play/billing/integrate)所述,如果连接丢失,app必须负责重新建立连接。我建议使用包含Billing API的单例类,并使用billingClient.isReady()方法检查连接是否成功,如果不成功,则尝试重新建立连接。假设您在BillingClientStateListener类覆盖方法中添加了日志记录。我跳过这段代码,因为它是直接的,并且在我上面提供的链接中有很好的文档记录。

代码语言:javascript
复制
public class ApplicationBillingClient
{
static ApplicationBillingClient applicationBillingClient= null;
private static BillingClient billingClient;

private ApplicationBillingClient() {}

private static boolean isInitialized()
{
    return applicationBillingClient != null && billingClient != null;
}

private static void initialize(Context applicationContext)
{
    try
    {
        if(applicationContext != null)
        {
            applicationBillingClient = new ApplicationBillingClient();
            BillingClient.Builder builder=  BillingClient.newBuilder(applicationContext);
            builder.setListener(new PurchaseActivityListener());
            builder.enablePendingPurchases();
            billingClient = builder.build();
        }

        LogUtil.info("Initializing the Billing Client");

    }
    catch (Exception ex)
    {
        LogUtil.error("Error while initializing billing client", ex);
    }

}

public static ApplicationBillingClient getInstance(Context applicationContext)
{
    if(isInitialized() == false)
    {
        initialize(applicationContext);
    }

    return  applicationBillingClient;
}

public void startConnection()
{
   billingClient.startConnection(new StateListener());
}

public boolean isReady()
{
    return billingClient.isReady();
}

public void getMonthlySubscription()
{
    try
    {
        if(billingClient.isReady())
        {
            SkuDetailsParams.Builder skuBuilder = SkuDetailsParams.newBuilder();
            skuBuilder.setType(BillingClient.SkuType.SUBS);
            skuBuilder.setSkusList(Arrays.asList(new String[]{MONTHLY_BILLING_SUBSCRIPTION_SKU}));
            SkuDetailsParams params = skuBuilder.build();
            billingClient.querySkuDetailsAsync(params, new SkuDetailsListener());
        }

    }
        catch (Exception ex)
    {
        LogUtil.error("Error while querying async SKU for Monthly Subscription", ex);
    }
  }
 }

 //In your activity
 ApplicationBillingClient appBillingClient = 
 ApplicationBillingClient.getInstance(applicationContext);
        if (appBillingClient.isReady() == false)
        {
            appBillingClient.startConnection();
        }
        else
        {
           appBillingClient.getMonthlySubscription();
        }
票数 1
EN

Stack Overflow用户

发布于 2019-05-29 06:55:17

当计费中断时,这是AndroidManifest中的应用程序节点:

代码语言:javascript
复制
<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"修复了计费问题。希望这能节省我浪费的时间。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56332090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档