Mar*_*ark 7 android google-play play-billing-library
如何查询 google play billing 5 中的产品列表?
从https://developer.android.com/google/play/billing/integrate#java中,我们通过将产品名称传递给 来查询单个产品的详细信息setProductId,
QueryProductDetailsParams queryProductDetailsParams =
QueryProductDetailsParams.newBuilder()
.setProductList(
ImmutableList.of(
Product.newBuilder()
.setProductId("product_id_example")
.setProductType(ProductType.SUBS)
.build()))
.build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
public void onProductDetailsResponse(BillingResult billingResult,
List<ProductDetails> productDetailsList) {
// check billingResult
// process returned productDetailsList
}
}
)
Run Code Online (Sandbox Code Playgroud)
但这只能得到一个产品,因此当您尝试打印时,List<ProductDetails> productDetailsList只有一个产品。那么如何传入多个产品呢?
据我所知,.setProductId("product_id_example")只需要一个字符串而不是一个列表。
由于某种原因,官方示例使用 anImmutableList来构建查询,但您实际上不需要使用它。该setProductList方法仅将List<Product>其作为输入,不需要ImmutableList.
你可以使用这样的东西(API 24+使用stream()):
List<String> ids = Arrays.asList("1","2","3"); // your product IDs
List<Product> productList = ids.stream().map( productId ->
Product.newBuilder()
.setProductId(productId)
.setProductType(BillingClient.ProductType.SUBS)
.build()
).collect(Collectors.toList());
QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
.setProductList(productList)
.build();
Run Code Online (Sandbox Code Playgroud)
如果你的 API < 24,你可以直接创建一个 ArrayList。
List<String> ids = Arrays.asList("1","2","3"); // your product IDs
ArrayList<Product> productList = new ArrayList<>();
for(String productId : ids) {
productList.add(
Product.newBuilder()
.setProductId(productId)
.setProductType(BillingClient.ProductType.SUBS)
.build()
);
}
QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
.setProductList(productList)
.build();
Run Code Online (Sandbox Code Playgroud)
我怀疑他们用 Kotlin 编写了这个示例(使用listOf),并自动将其转换为 Java(以某种方式给了我们ImmutableList.of)...
看起来可以在这里找到一个很好的答案:Adding multiple products to Productlist for queryProductDetailsAsync in android billing 5.0.0
但我将在下面提供一些评论:
要添加其他产品,我们需要将产品放在 中immutableList,因此如果没有 for 循环,我们只需:
QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder()
.setProductList(
ImmutableList.of(
QueryProductDetailsParams.Product.newBuilder()
.setProductId("Product1")
.setProductType(BillingClient.ProductType.INAPP)
.build(),
QueryProductDetailsParams.Product.newBuilder()
.setProductId("Product2")
.setProductType(BillingClient.ProductType.INAPP)
.build()
)).build();
Run Code Online (Sandbox Code Playgroud)
但是,如果您的产品需要动态填充,那么这就不适合。这意味着我们需要动态填充ImmutableList. 您会注意到addfor 的方法ImmutableList已被弃用,因此该add方法不执行任何操作。
作为解决方法,我创建了一个ArrayList,将产品填充到 中ArrayList,然后将其转换为ImmutableList
ImmutableList<QueryProductDetailsParams.Product> productsList = ImmutableList.of();
ArrayList<QueryProductDetailsParams.Product> products = new ArrayList();
for (String productId : productIds ) {
products.add(QueryProductDetailsParams.Product.newBuilder()
.setProductId(productId)
.setProductType(BillingClient.ProductType.INAPP)
.build());
}
productsList = ImmutableList.copyOf(products);
QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder()
.setProductList(productsList).build();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3384 次 |
| 最近记录: |