Android InApp Purcahse问题:为什么显示未解决的引用:BillingFlowParams的setType?

Android InApp Purcahse问题:为什么显示未解决的引用:BillingFlowParams的setType?,android,in-app-purchase,in-app-billing,in-app-subscription,android-inapp-purchase,Android,In App Purchase,In App Billing,In App Subscription,Android Inapp Purchase,在android中使用计费库并购买订阅而不是应用程序内产品(耗材-非耗材),将.setType(SkuType.SUBS)添加到计费流程参数,如下所示: val billingFlowParams = BillingFlowParams .newBuilder() .setType(SkuType.SUBS)

在android中使用计费库并购买订阅而不是应用程序内产品(耗材-非耗材),将
.setType(SkuType.SUBS)
添加到
计费流程参数
,如下所示:

val billingFlowParams = BillingFlowParams
                                    .newBuilder()
                                    .setType(SkuType.SUBS)
                                    .setSkuDetails(skuDetailsList!![i])
                                    .build()
但是,
.setType(SkuType.SUBS)
显示未解析的引用:setType


可能是什么问题如何启动应用内订阅的购买流

请尝试
BillingClient.SkuType.SUBS

您可以像下面这样启动购买流

billingClient.launchBillingFlow(this, billingFlowParams).getResponseCode();
@Override
    public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
            //Purchase Acknowledged and verified
        } else {
            Toast.makeText(this, "Purchase Failed", Toast.LENGTH_LONG).show();
        }
        Log.e("Acknowledged Purchase:", billingResult.toString());

    }
如果我们再深入一点,
-顺便说一句,它是用java编写的

首先,您必须在类中实现
PurchasesUpdatedListener、AcknowledgePurchaseResponseListener
,并重写
onPurchasesUpdated
onAcknowledgePurchaseResponse
方法。
然后初始化计费客户端

private void initBilling() {
        billingClient = BillingClient.newBuilder(this)
                .enablePendingPurchases()
                .setListener(this)
                .build();
        billingClient.startConnection(new BillingClientStateListener() {

            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    Purchase.PurchasesResult purchasesResult = billingClient.queryPurchases(BillingClient.SkuType.SUBS);
                    billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.SUBS, (billingResult1, purchaseHistoryRecordList) -> {
                        Log.i("SKURESLUT", purchaseHistoryRecordList.toString());
                    });
                }
            }

            @Override
            public void onBillingServiceDisconnected() {

            }
        });
    }

然后您可以将所需的包id传递给以下方法并启动billingFlow

private void getBillingPackage(String id) {
        List<String> productIdsList = new ArrayList<>();
        productIdsList.add(id);
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(productIdsList).setType(BillingClient.SkuType.SUBS);
        billingClient.querySkuDetailsAsync(params.build(),
                (result, skuDetailsList) -> {
                    if (!skuDetailsList.isEmpty()) {
                        mSkuDetails.addAll(skuDetailsList);
                        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                                .setSkuDetails(skuDetailsList.get(0))
                                .build();
                        int responseCode = billingClient.launchBillingFlow(this, billingFlowParams).getResponseCode();
                    } else {
                        Toast.makeText(this, "Requested package not available", Toast.LENGTH_LONG).show();
                    }
                    Log.e("SKURESLUT", result.toString());
                });
    }

它会给您一个错误,因为在
Builder
类上没有名为
setType
的方法。请参阅此处:但是,如果我想启动订阅的购买流而不是应用内产品(耗材非消费品),该怎么办?什么是mSkuDetails?这是我从querySkuDetailsAsync接收的本地数组列表。别理他,兄弟。事实上,我也在做同样的事情,但有一个小错误。顺便说一句,从你的答案中知道一些新的代码行。谢谢。这里有一个问题:在onBillingSetupFinished方法中,我们将获得用户先前购买的商品,对吗?
@Override
    public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
            //Purchase Acknowledged and verified
        } else {
            Toast.makeText(this, "Purchase Failed", Toast.LENGTH_LONG).show();
        }
        Log.e("Acknowledged Purchase:", billingResult.toString());

    }