You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:23:28