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

问题描述 投票:0回答:4

如何查询 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
        }
    }
)

但是这只得到一个产品,因此当您尝试打印时

List<ProductDetails> productDetailsList
只有一个产品。那么如何传入多个产品呢?

据我所知

.setProductId("product_id_example")
只需要一个字符串而不是一个列表。

android google-play play-billing-library
4个回答
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, you could just make an ArrayList instead.

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
投票

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

但是,如果您的产品需要动态填充,那么这就不适合。这意味着我们需要动态填充

ImmutableList
中的项目。您会注意到
add
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();

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"
        )

0
投票

要从 Google Play 结算库版本 5(或更高版本)查询产品列表,通常使用 QueryProductDetailsParams 方法。以下是如何执行此操作的总体概述:

val productList = ArrayList<QueryProductDetailsParams.Product>()
                        productList.add(
                            QueryProductDetailsParams.Product.newBuilder()
                                .setProductId(Constants.BASE_PLAN)
                                .setProductType(SUBS)
                                .build()
                        )
                        productList.add(
                            QueryProductDetailsParams.Product.newBuilder()
                                .setProductId(Constants.STANDER_PLAN)
                                .setProductType(SUBS)
                                .build()
                        )
© www.soinside.com 2019 - 2024. All rights reserved.