如何从 Google Play Billing 5 获取多个产品详细信息?

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")只需要一个字符串而不是一个列表。

Tyl*_*r V 5

由于某种原因,官方示例使用 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)...


Mar*_*ark 3

看起来可以在这里找到一个很好的答案: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)