【发布时间】:2022-08-23 03:51:56
【问题描述】:
在 v4 中,我曾经有 SkuDetails.price 来获取产品的价格,但现在它在 v5 中的新 ProductDetails 中不再可用。
在这个新版本中如何获得产品的价格?
标签: in-app-billing android-billing play-billing-library
在 v4 中,我曾经有 SkuDetails.price 来获取产品的价格,但现在它在 v5 中的新 ProductDetails 中不再可用。
在这个新版本中如何获得产品的价格?
标签: in-app-billing android-billing play-billing-library
当您致电getSubscriptionOfferDetails 时,它会返回可供订阅产品购买的优惠。然后您可以致电getPricingPhases() 获取定价阶段列表。每个定价阶段对象都有一个getFormattedPrice() 调用以获取报价的定价短语的价格 (https://developer.android.com/reference/com/android/billingclient/api/ProductDetails.PricingPhase)
【讨论】:
OnetimePurchaseOfferDetails 对象有一个 getFormattedPrice() 调用。 developer.android.com/reference/com/android/billingclient/api/…
您必须检查可用产品
fun getAvailableProducts() {
Timber.d("!!! Getting available products to buy ...")
val queryProductDetailsParams =
QueryProductDetailsParams.newBuilder()
.setProductList(
listOf(
QueryProductDetailsParams.Product.newBuilder()
.setProductId(SKU_SUBSCRIBE_MONTHLY)
.setProductType(BillingClient.ProductType.SUBS)
.build(),
QueryProductDetailsParams.Product.newBuilder()
.setProductId(SKU_SUBSCRIBE_YEARLY)
.setProductType(BillingClient.ProductType.SUBS)
.build()
))
.build()
billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
billingResult,
productDetailsList ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
availableProducts.tryEmit(productDetailsList)
getPrices(productDetailsList)
} else {
Timber.d("!!!Error getting available Products to buy: ${billingResult.responseCode} ${billingResult.debugMessage}")
}
}
}
接着
private fun getPrices(productDetailsList: MutableList<ProductDetails>) {
productDetailsList.forEach{
when (it.productId) {
SKU_SUBSCRIBE_MONTHLY -> {
currency.tryEmit(it.subscriptionOfferDetails?.get(0)?.pricingPhases!!.pricingPhaseList[0]?.priceCurrencyCode.toString())
monthlyPrice.tryEmit(it.subscriptionOfferDetails?.get(0)?.pricingPhases!!.pricingPhaseList[0]?.formattedPrice.toString())
Timber.d("!!!! $it.")
}
SKU_SUBSCRIBE_YEARLY -> {
// currency.tryEmit(it.subscriptionOfferDetails?.get(0)?.pricingPhases!!.pricingPhaseList[0]?.priceCurrencyCode.toString())
yearlyPrice.tryEmit(it.subscriptionOfferDetails?.get(0)?.pricingPhases!!.pricingPhaseList[0]?.formattedPrice.toString())
Timber.d("!!!! $it.")
}
}
}
}
【讨论】:
我使用以下代码获取价格详细信息。
私人无效查询产品(){
QueryProductDetailsParams queryProductDetailsParams
= QueryProductDetailsParams.newBuilder().setProductList(
ImmutableList.of(QueryProductDetailsParams.Product.newBuilder()
.setProductId("your_product_id")
.setProductType(BillingClient.ProductType.INAPP).build()))
.build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
@Override
public void onProductDetailsResponse(@NonNull BillingResult billingResult, @NonNull List<ProductDetails> list) {
if(!list.isEmpty()){
productDetails = list.get(0);
itemdesc.setText(productDetails.getName());
itemprice.setText(productDetails.getOneTimePurchaseOfferDetails().getFormattedPrice());
itemprice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
makePurchase();
}
});
}else {
Log.i("playsresponse", "no response from google play");
}
}
}
);
【讨论】: