Android Kotlin内购:purchase.productId未解析引用问题排查
Android Kotlin内购:Purchase.productId引用未解决问题排查与解决
问题场景
在Android Kotlin内购开发中,遍历List<Purchase>时尝试调用purchase.productId,编译器提示Unresolved reference,但purchase.purchaseTime、purchase.purchaseState、purchase.packageName等其他属性均可正常调用。日志输出的Purchase序列化JSON中明确包含productId字段:
{"orderId":"GPA.333.333.333","packageName":"de.bla.foo","productId":"no_ads_in_app_3_months","purchaseTime":1694810217354,"purchaseState":0,"purchaseToken":"xxxxxxxxxxxx","quantity":1,"acknowledged":true}
问题原因
核心原因是Google Play Billing Library版本差异:
- Billing Library 4.0及以上版本才为
Purchase类添加了公开的productId属性; - 若当前依赖的是3.x或更早版本,
Purchase类并没有暴露这个属性——虽然序列化JSON里有该字段,但它不属于类的公开成员,因此无法直接调用。
解决方法
方法1:升级Billing Library到4.0+版本
修改模块级build.gradle(或build.gradle.kts)中的依赖,使用4.0及以上版本的Billing Library:
dependencies { // 可替换为最新稳定版,如6.0.1 implementation 'com.android.billingclient:billing:4.0.0' }
同步项目后,即可直接调用purchase.productId。
方法2:在旧版本库中通过skus属性获取productId
若暂时无法升级库,可使用旧版本Purchase类提供的skus属性(对应Java的getSkus()方法)获取商品ID,旧版本支持多商品购买,取列表第一个元素即可:
// 替换原purchase.productId为以下代码 val productId = purchase.skus.firstOrNull() when (productId) { "no_ads_in_app_month" -> { // 逻辑处理 } "no_ads_in_app_3_months" -> { // 逻辑处理 } }
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

