播放计费库连接并查询sku详情

Mee*_*eep 5 connection android sku play-billing-library

我需要一些关于如何建立连接和查询 sku 详细信息的信息。我正在编写教程并将应用程序内计费逻辑复制到我的应用程序中。

https://codelabs.developers.google.com/codelabs/play-billing-codelab

我按照教程进行操作,没有任何问题。问题在于如何建立连接,然后查询 sku 详细信息。

当我创建 BillingManager 类的实例时,它会尝试建立连接 -

public BillingManager(Activity activity) {
    mActivity = activity;
    mBillingClient = BillingClient.newBuilder(mActivity).setListener(this).build();
    mBillingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponse) {
            if (billingResponse == BillingClient.BillingResponse.OK) {
                Log.i(TAG, "onBillingSetupFinished() response: " + billingResponse);
            } else {
                Log.w(TAG, "onBillingSetupFinished() error code: " + billingResponse);
            }
        }
        @Override
        public void onBillingServiceDisconnected() {
            Log.w(TAG, "onBillingServiceDisconnected()");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

然后,我将进行异步查询来获取 sku 详细信息 -

private void handleManagerAndUiReady() {
    // Start querying for SKUs
    List<String> inAppSkus = mBillingProvider.getBillingManager()
            .getSkus(SkuType.INAPP);
    mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.INAPP,
            inAppSkus,
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode,
                        List<SkuDetails> skuDetailsList) {
                    if (responseCode == BillingResponse.OK
                            && skuDetailsList != null) {
                        for (SkuDetails details : skuDetailsList) {
                            Log.w(TAG, "Got a SKU: " + details);
                        }
                    }
                }
            });

    // Show the UI
    displayAnErrorIfNeeded();
}
Run Code Online (Sandbox Code Playgroud)

然后我让监听器收到错误,但连接没有任何问题。

D/StoreListFragment: onCreate
I/StoreListFragment: SkuDetailsResponseListener response code: -1
D/StoreListFragment: onViewCreated
I/BillingManager: onBillingSetupFinished() response: 0
Run Code Online (Sandbox Code Playgroud)

所以我不得不摸索了一段时间,放弃了查看Play Billing Library的基础知识——

https://medium.com/exploring-android/exploring-the-play-billing-library-for-android-55321f282929

这就是我找到解决方案的地方,我只是将查询放在成功连接的连接中。我意识到播放计费库在查询 sku 详细信息之前不会检查连接,或者我在某个地方做错了,因为教程工作正常?

private void createBillingClient() {
    mBillingClient = BillingClient.newBuilder(getActivity()).setListener(this).build();

    mBillingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(int billingResponse) {
            if (billingResponse == BillingClient.BillingResponse.OK) {
                Log.i(TAG, "onBillingSetupFinished() response: " + billingResponse);

                //setting up a listener for the queries
                SkuDetailsResponseListener responseListener = new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(int responseCode,
                                                     List<SkuDetails> skuDetailsList) {
                        Log.i(TAG, "response code: " + responseCode);
                    }
                };

                List<String> skuList = Arrays.asList("sku_01", "sku_02");
                SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
                        .setSkusList(skuList).setType(BillingClient.SkuType.SUBS).build();

                mBillingClient.querySkuDetailsAsync(skuDetailsParams, responseListener);
            } else {
                Log.w(TAG, "onBillingSetupFinished() error code: " + billingResponse);
            }
        }

        @Override
        public void onBillingServiceDisconnected() {
            Log.w(TAG, "onBillingServiceDisconnected()");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用此逻辑来检查连接是否已准备好,然后像普通驱动器一样执行可运行文件 - 引用此网址。看起来逻辑不会检查计费连接是否处于待处理状态......

https://github.com/zumrywahid/in_app_example

Is Billing Client connected? : false
Client is already in the process of connecting to billing service.
onBillingSetupFinished() error code: 5
Run Code Online (Sandbox Code Playgroud)

und*_*oid 4

BillingManager 构造函数已经开始连接,如果您初始化管理器并立即调用任何传递 runnable 的方法,executeServiceRequest(Runnable runnable)也会尝试同时启动连接。您可以startServiceConnection()在构造函数中禁用,因为连接状态始终会签入executeServiceRequest()并在需要时启动连接。