Play计费库连接与查询SKU详情

5

我需要你在连接和查询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()");
        }
    });
}

然后,我将进行异步查询以获取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();
}

然后我发现监听器出现错误,但连接却没有任何问题。
D/StoreListFragment: onCreate
I/StoreListFragment: SkuDetailsResponseListener response code: -1
D/StoreListFragment: onViewCreated
I/BillingManager: onBillingSetupFinished() response: 0

所以我不得不花一些时间去摸索,最后放弃了检查Play计费库的基础知识 -

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

那就是我找到解决方案的地方,我只是将查询放在成功连接的连接中。我意识到play计费库在查询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()");
        }
    });
}

我尝试使用此逻辑检查连接是否准备好,然后像引用此URL的平凡驱动器一样执行可运行文件。看起来这个逻辑没有检查计费连接是否挂起...

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
2个回答

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

0
我是这样解决这个问题的:
我创建了一个帮助类来管理计费,并添加了监听器,这样我只能在其他操作准备就绪时执行。
例如,我尝试在活动的onCreate中显示应用内购买列表,但列表总是为空。那是因为querySkuDetailsAsync的结果是在执行显示列表的代码之后接收到的。 我创建了一个监听器,在接收到结果后才显示列表。
interface BillingResponseIsAvailableListener {
void onBillingResponseIsAvailable(List<SkuDetails> theList);
}

public class BillingTools {
    List<String> skuList = new ArrayList<>();
    private List<BillingResponseIsAvailableListener> listeners = new ArrayList<>();
    private BillingClient billingClient;
    private Context context;

public BillingTools(Context context) {
    this.context = context;
    createSKUList();  //method to create the list of sku's for your app
}

public void addListener(BillingResponseIsAvailableListener toAdd) {
    listeners.add(toAdd);
}

在查询sku列表的地方,当列表准备好时,只需添加监听器:

billingClient.querySkuDetailsAsync(params.build(), (billingResult2, skuDetailsList) -> {
                    if (billingResult2.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
                        for (BillingResponseIsAvailableListener bL : listeners) {
                            bL.onBillingResponseIsAvailable(skuDetailsList);
                        }
                    }
                });

以上代码仅为示例,建议您为所需的任何内容创建自己的监听器。它是一个名为queryOptionsList();的方法的一部分。 在调用活动中,只需让监听器执行您需要对列表执行的任何操作即可:
    BillingTools takeTheirMoney = new BillingTools(this);
    takeTheirMoney.startBillingClient();
    takeTheirMoney.addListener(new BillingResponseIsAvailableListener() {
        @Override
        public void onBillingResponseIsAvailable(List<SkuDetails> theList) {
            showPurchaseOptions(findViewById(R.id.purchases_container), theList, takeTheirMoney);
            }
        });
    takeTheirMoney.queryOptionsList();

如果您遇到连接未准备好的问题,只需添加另一个监听器来监视连接何时成功,并在该监听器中放置其他操作(这些操作也可以有自己的监听器)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接