在android billing 5.0.0中为queryProductDetailsAsync添加多个产品到产品列表

qcbq4gxm  于 2022-11-27  发布在  Android
关注(0)|答案(2)|浏览(666)

在旧的android计费实现中,您将构建一个sku列表来查询产品:

List<String> skuList = new ArrayList<>();
        skuList.add(SKU_POTION);
        skuList.add(SKU_SWORD);
        skuList.add(SKU_BOW);
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);

新的计费实施更加复杂,似乎限制您只能向查询列表中添加一个产品:

ImmutableList<QueryProductDetailsParams.Product> productList = ImmutableList.from(QueryProductDetailsParams.Product.newBuilder()
                    .setProductId(SKU_POTION)
                    .setProductType(BillingClient.ProductType.INAPP)
                    .build());
    
            QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
                    .setProductList(productList)
                    .build();
    
            billingClient.queryProductDetailsAsync(
            params,
            new ProductDetailsResponseListener() {
                public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && productDetailsList != null) {
                        for (ProductDetails skuDetails : productDetailsList) {                    
                            mProductDetailsMap.put(skuDetails.getProductId(), skuDetails);                           
                        }
                    }
                   
                }
            }
    );

它让您为mProductDetailsMap的productDetailsList构建productList,这是启动购买流程所需的:

puchasestring=SKU_POTION;
initiatePurchaseFlow(mProductDetailsMap.get(puchasestring));

如何将多个产品添加到开始实现的productList中?我不想为每个要添加到mProductDetailsMap的项重复整个代码段,这是我现在使用的Primitive Pete方法。

abithluo

abithluo1#

你实际上并不需要使用ImmutableList。官方的例子出于某种原因使用ImmutableList来构建查询,但这并不是必需的。setProductList方法只是把List<Product>作为它的输入,所以你可以这样做:

List<String> skuList = Arrays.asList(SKU_POTION, SKU_SWORD, SKU_BOW);

ArrayList<Product> productList = new ArrayList<>();
for(String sku : skuList) {
    productList.add(
        Product.newBuilder()
            .setProductId(sku)
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    );
}

QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
        .setProductList(productList)
        .build();

billingClient.queryProductDetailsAsync(params, new ProductDetailsResponseListener() {
    public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) {
        // handle response
    }
}

实现List接口的任何东西都可以工作-ArrayListImmutableList等...

更新

如果你想查询INAPP和SUBS类型的混合,你不能用一个调用来完成。但是,你可以使用流来合并这两个异步调用,并同时运行它们(比一次运行一个更快,更容易处理结果)
首先,创建一个helper函数,为每个queryProductDetails调用返回一个流(这需要gradle中的计费-ktx扩展)

private fun getDetailsFlow(productIds: List<String>, type: String) : Flow<List<ProductDetails>> {

    val productList = productIds.map { productId ->
        QueryProductDetailsParams.Product.newBuilder()
            .setProductId(productId)
            .setProductType(type)
            .build()
    }

    val params = QueryProductDetailsParams.newBuilder().setProductList(productList).build()

    return flow {
        emit(billingClient?.queryProductDetails(params))
    }.map { result ->
        result?.productDetailsList ?: emptyList()
    }
}

然后将两个流压缩在一起,得到一个产品列表。

fun queryProductDetails() {

    val inAppFlow = getDetailsFlow(listOf(Product.GOLD, Product.SILVER), BillingClient.ProductType.INAPP)
    val subsFlow = getDetailsFlow(listOf(Product.UNLIMITED), BillingClient.ProductType.SUBS)

    val allDetailsFlow = inAppFlow.zip(subsFlow) { inAppResult, subsResult ->
        return@zip inAppResult + subsResult
    }

    scope.launch {
        allDetailsFlow.collect { productList ->
            // handle the unified list of all products, subscription and in-app
        }
    }
}
6ljaweal

6ljaweal2#

对于多个产品:

ImmutableList<QueryProductDetailsParams.Product> productList = ImmutableList.from(
QueryProductDetailsParams.Product.newBuilder()
                    .setProductId(SKU_POTION)
                    .setProductType(BillingClient.ProductType.INAPP)
                    .build(),
QueryProductDetailsParams.Product.newBuilder()
                    .setProductId(SKU_SWORD)
                    .setProductType(BillingClient.ProductType.INAPP)
                    .build(),
QueryProductDetailsParams.Product.newBuilder()
                    .setProductId(SKU_BOW)
                    .setProductType(BillingClient.ProductType.INAPP)
                    .build());

相关问题