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

7

如何从Google Play计费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
        }
    }
)

但这只能获取单个产品,因此当您尝试打印 List<ProductDetails> productDetailsList 时,只会显示一个。那么如何传入多个产品呢?

据我所知,.setProductId("product_id_example") 只能接受一个字符串而不是列表。

3个回答

5
官方示例中出于某种原因使用了ImmutableList来构建查询,但实际上您不需要使用它。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();

如果您的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();

我怀疑他们用Kotlin编写了示例(使用listOf),然后自动转换为Java(以某种方式给我们ImmutableList.of)...


3

看起来可以在这里找到一个好的答案:在Android计费5.0.0中为queryProductDetailsAsync添加多个产品到productlist

但我会在下面提供一些评论:

要添加其他产品,我们需要将这些产品添加到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();

然而,如果您的产品需要动态填充,这种方法就不适用了。这意味着我们需要动态填充ImmutableList中的项目。您会注意到ImmutableListadd方法已被弃用,因此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();

1
我注意到我们不能在单个查询中同时查询ProductType.INAPPProductType.SUBS,有没有一种方法可以在单个请求中获取两者? - Om Infowave Developers

0

你只需要使用 MutableList 就可以轻松实现

val productList : MutableList<QueryProductDetailsParams.Product> = arrayListOf()
for (product in LIST_OF_PRODUCTS) {
    productList.add(
        QueryProductDetailsParams.Product.newBuilder()
            .setProductId(product)
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    )
}

private val LIST_OF_PRODUCTS = listOf(
            "basic_subscription",
            "premium_subscription"
        )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接