如何查询 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")
只需要一个字符串而不是一个列表。
官方示例出于某种原因使用
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
)...
看起来可以在这里找到一个很好的答案: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();
您只需使用 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"
)
要从 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()
)