Billing Library 5中QueryPurchasesAsync始终返回服务断开,迁移后无法检查购买状态
Billing Library 5.x queryPurchasesAsync 返回服务断开的排查方案
核心排查点
确认BillingClient连接状态
Billing Library 5.x要求必须在客户端完全连接后才能调用查询接口。你需要确保:- 已经调用
billingClient.startConnection(),并在onBillingSetupFinished回调收到BillingClient.BillingResponseCode.RESULT_OK后再执行queryPurchasesAsync。 - 避免在Activity生命周期早期(如
onCreate未等待连接完成)或连接断开时发起查询。
- 已经调用
修复API常量与回调逻辑
5.x中部分常量的引用方式有变化,你的代码存在混淆风险:- 必须使用
BillingClient.BillingResponseCode.RESULT_OK和BillingClient.BillingResponseCode.RESULT_CANCELED,而非未限定的同名常量,避免与其他类的常量冲突。 - 补充
SERVICE_DISCONNECTED的分支处理,明确触发重连逻辑。
- 必须使用
检查依赖与权限
- 确认
build.gradle中依赖的是5.x版本的Billing Library,例如:implementation 'com.android.billingclient:billing:5.2.0' - 确保
AndroidManifest.xml已添加必要权限:<uses-permission android:name="com.android.vending.BILLING" />
- 确认
实现断开重连机制
BillingClient可能因系统原因断开连接,必须在回调中处理重连:@Override public void onBillingServiceDisconnected() { // 延迟重连,避免频繁请求 new Handler(Looper.getMainLooper()).postDelayed(() -> { billingClient.startConnection(this); }, 1000); }
调整后的示例代码
// 仅在BillingClient连接成功后调用此方法 private void queryInAppPurchases() { QueryPurchasesParams params = QueryPurchasesParams.newBuilder() .setProductType(BillingClient.ProductType.INAPP) .build(); billingClient.queryPurchasesAsync(params, (billingResult, purchases) -> { int responseCode = billingResult.getResponseCode(); switch (responseCode) { case BillingClient.BillingResponseCode.RESULT_OK: if (!purchases.isEmpty()) { Toast.makeText(getApplicationContext(), "已查询到购买记录", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "无购买记录", Toast.LENGTH_LONG).show(); } break; case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: Toast.makeText(getApplicationContext(), "服务断开,正在重连", Toast.LENGTH_LONG).show(); billingClient.startConnection(billingClientStateListener); break; default: Toast.makeText(getApplicationContext(), "查询失败:" + billingResult.getDebugMessage(), Toast.LENGTH_LONG).show(); } }); }
额外测试建议
- 使用真实设备测试,部分模拟器的Google Play服务不完整,可能导致连接问题。
- 确保测试账号已加入Google Play Console的应用测试计划,且内购商品状态为活跃。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

