Android Play Billing Library: onSkuDetailsResponse responseCode为0,但是skuDetailsList的size也为0
Android Play Billing Library: onSkuDetailsResponse responseCode is 0, but the size of skuDetailsList is also 0
我现在正在使用新的 Play 结算库
基本上,我按照文档查询了可购买的商品
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(itemType);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
listener.onSkuDetailsResponse(responseCode, skuDetailsList);
}
然而,responseCode为0,列表也为空。但是我检查了 onBillingSetupFinished 是成功的。提供给 SkuDetailsParams.Builder 的 skuList 不为空,并且 skuList (sku_id) 中的值也与 Google Play Console 上指定的产品 ID 相同。
有谁知道原因吗?谢谢!!
听起来您的 Google Play 管理中心设置有问题。
请检查:
- 您的应用已在 Play 管理中心发布(发布到 PROD 或您的@gmail 帐户在用户的 alpha/beta 群组中)
- 我还建议将您的测试@gmail 帐户添加到 license testers list 以避免收费和许可证问题
- 具有正确的签名并且测试应用的版本代码与已发布的相同
- 您的所有 SKU 也已发布
- 您的 Play 商店应用在您正在测试的 phone 上正常运行(例如,允许您购买应用)
设置完成后等待一段时间。
您不需要上传您的 apk。
你应该得到 skus。即使您在调试模式下测试 BillingClient 也应该可以正常工作。
确保产品或订阅有效。
给它一些时间。计费过程可能需要几个小时才能更新您的产品。
我也遇到了同样的问题,但是通过执行以下操作,我得到了 SkuDetails。
- 停止Google播放应用程序
- 删除 Google Play 应用的缓存
- 停止并启动应用程序
我花了几个小时解决这个问题,问题是我的调试 build/CI 构建有 applicationIdSuffix
。因此只有具有正确 applicationId 的生产构建才能检索产品。
核心问题是Google缓存了你的SKU详情,而且有多层缓存。
您 phone 上的本地 Google Play 商店应用会缓存 SKU 详细信息,Google 的 server-side 也会缓存它们。 ("There are only two hard things in Computer Science: cache invalidation and naming things.")
最终,如果您等待的时间足够长,缓存将过期并且 Google 将开始显示正确的信息。但是谁有时间呢?
由于涉及时间因素,所以很难知道什么有用什么没用,但这对我有用。
在内部测试轨道上设置您的 APK 版本。 (第一次执行此操作时,您必须等待您的应用完成“待发布”。等待本身可能会解决问题。)
设置至少一个测试人员,获取 opt-in link(这需要等待您的应用完成“待发布”),以及 opt-in.
使用“设置”应用的“应用”部分强制停止并删除 Google Play 商店应用的缓存。单击“存储”以访问“清除缓存”按钮。
通过内部测试轨道下载一个应用程序版本。使用 android.util.Log
记录您的 SKU 详细信息,并使用 Logcat 验证您的 SKU 详细信息是否正确显示。
…但别担心,您不必每次都想测试就这样做。 Google Play 商店缓存更新后,您应该能够使用 Android Studio 在调试版本中访问您的 SKU。
如果它在您的内部测试版本中不起作用
- 卸载该应用程序,强制停止 Google Play 商店应用程序,清除其缓存,然后重新下载内部测试版本。
- 还是不行?您的 Google Play 开发者控制台出了点问题。也许您的产品尚未激活?也许您在 SKU 列表中拼错了 SKU?
如果它在您的内部测试版本中有效,但在同一设备上的调试版本中无效
在这种情况下,Google Play 商店缓存是正确的,但您的调试版本与您创建的内部测试版本有些不同。
- 确认您的调试版本使用与内部测试版本相同的包名。
applicationIdSuffix
是这里的常见罪魁祸首。
- 验证您的调试构建版本代码是否与您上传到内部测试的 APK 版本代码匹配。
- 尝试在不使用 Google Play 商店的情况下手动安装您的内部测试 APK。如果可行,则您有两个 APK,其中一个有效,另一个无效。检查它们是否存在差异。 (APK 是 zip 文件;您可以在那里四处寻找。)
如果应用程序中集成的产品是订阅,请确保设置 SkuType.SUBS
而不是 SkuType.INAPP
val skuDetailsParams = SkuDetailsParams.newBuilder()
...
.setType(SkuType.SUBS)
.build()
GL
Source
除了之前的答案外,当您在没有 Internet 连接的情况下执行搜索时,SkuDetailsList 可能为空。所以你也必须在你的代码中管理这种情况。
在应用内购买不可用的国家(古巴、中国等)的用户也会发生这种情况
在游戏控制台的 Pricing & distribution
部分查看国家/地区状态
您的应用必须在 Google Play 商店中获得批准,这可能需要长达 1 周的时间
我现在正在使用新的 Play 结算库
基本上,我按照文档查询了可购买的商品
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(itemType);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
listener.onSkuDetailsResponse(responseCode, skuDetailsList);
}
然而,responseCode为0,列表也为空。但是我检查了 onBillingSetupFinished 是成功的。提供给 SkuDetailsParams.Builder 的 skuList 不为空,并且 skuList (sku_id) 中的值也与 Google Play Console 上指定的产品 ID 相同。
有谁知道原因吗?谢谢!!
听起来您的 Google Play 管理中心设置有问题。
请检查:
- 您的应用已在 Play 管理中心发布(发布到 PROD 或您的@gmail 帐户在用户的 alpha/beta 群组中)
- 我还建议将您的测试@gmail 帐户添加到 license testers list 以避免收费和许可证问题
- 具有正确的签名并且测试应用的版本代码与已发布的相同
- 您的所有 SKU 也已发布
- 您的 Play 商店应用在您正在测试的 phone 上正常运行(例如,允许您购买应用)
设置完成后等待一段时间。
您不需要上传您的 apk。
你应该得到 skus。即使您在调试模式下测试 BillingClient 也应该可以正常工作。
确保产品或订阅有效。
给它一些时间。计费过程可能需要几个小时才能更新您的产品。
我也遇到了同样的问题,但是通过执行以下操作,我得到了 SkuDetails。
- 停止Google播放应用程序
- 删除 Google Play 应用的缓存
- 停止并启动应用程序
我花了几个小时解决这个问题,问题是我的调试 build/CI 构建有 applicationIdSuffix
。因此只有具有正确 applicationId 的生产构建才能检索产品。
核心问题是Google缓存了你的SKU详情,而且有多层缓存。
您 phone 上的本地 Google Play 商店应用会缓存 SKU 详细信息,Google 的 server-side 也会缓存它们。 ("There are only two hard things in Computer Science: cache invalidation and naming things.")
最终,如果您等待的时间足够长,缓存将过期并且 Google 将开始显示正确的信息。但是谁有时间呢?
由于涉及时间因素,所以很难知道什么有用什么没用,但这对我有用。
在内部测试轨道上设置您的 APK 版本。 (第一次执行此操作时,您必须等待您的应用完成“待发布”。等待本身可能会解决问题。)
设置至少一个测试人员,获取 opt-in link(这需要等待您的应用完成“待发布”),以及 opt-in.
使用“设置”应用的“应用”部分强制停止并删除 Google Play 商店应用的缓存。单击“存储”以访问“清除缓存”按钮。
通过内部测试轨道下载一个应用程序版本。使用
android.util.Log
记录您的 SKU 详细信息,并使用 Logcat 验证您的 SKU 详细信息是否正确显示。
…但别担心,您不必每次都想测试就这样做。 Google Play 商店缓存更新后,您应该能够使用 Android Studio 在调试版本中访问您的 SKU。
如果它在您的内部测试版本中不起作用
- 卸载该应用程序,强制停止 Google Play 商店应用程序,清除其缓存,然后重新下载内部测试版本。
- 还是不行?您的 Google Play 开发者控制台出了点问题。也许您的产品尚未激活?也许您在 SKU 列表中拼错了 SKU?
如果它在您的内部测试版本中有效,但在同一设备上的调试版本中无效
在这种情况下,Google Play 商店缓存是正确的,但您的调试版本与您创建的内部测试版本有些不同。
- 确认您的调试版本使用与内部测试版本相同的包名。
applicationIdSuffix
是这里的常见罪魁祸首。 - 验证您的调试构建版本代码是否与您上传到内部测试的 APK 版本代码匹配。
- 尝试在不使用 Google Play 商店的情况下手动安装您的内部测试 APK。如果可行,则您有两个 APK,其中一个有效,另一个无效。检查它们是否存在差异。 (APK 是 zip 文件;您可以在那里四处寻找。)
如果应用程序中集成的产品是订阅,请确保设置 SkuType.SUBS
而不是 SkuType.INAPP
val skuDetailsParams = SkuDetailsParams.newBuilder()
...
.setType(SkuType.SUBS)
.build()
GL
Source
除了之前的答案外,当您在没有 Internet 连接的情况下执行搜索时,SkuDetailsList 可能为空。所以你也必须在你的代码中管理这种情况。
在应用内购买不可用的国家(古巴、中国等)的用户也会发生这种情况
在游戏控制台的 Pricing & distribution
部分查看国家/地区状态
您的应用必须在 Google Play 商店中获得批准,这可能需要长达 1 周的时间