在旧的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方法。
2条答案
按热度按时间abithluo1#
你实际上并不需要使用
ImmutableList
。官方的例子出于某种原因使用ImmutableList
来构建查询,但这并不是必需的。setProductList
方法只是把List<Product>
作为它的输入,所以你可以这样做:实现
List
接口的任何东西都可以工作-ArrayList
、ImmutableList
等...更新
如果你想查询INAPP和SUBS类型的混合,你不能用一个调用来完成。但是,你可以使用流来合并这两个异步调用,并同时运行它们(比一次运行一个更快,更容易处理结果)
首先,创建一个helper函数,为每个
queryProductDetails
调用返回一个流(这需要gradle中的计费-ktx
扩展)然后将两个流压缩在一起,得到一个产品列表。
6ljaweal2#
对于多个产品: