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

Billing Library 5中QueryPurchasesAsync始终返回服务断开,迁移后无法检查购买状态

Billing Library 5.x queryPurchasesAsync 返回服务断开的排查方案

核心排查点

  • 确认BillingClient连接状态
    Billing Library 5.x要求必须在客户端完全连接后才能调用查询接口。你需要确保:

    1. 已经调用billingClient.startConnection(),并在onBillingSetupFinished回调收到BillingClient.BillingResponseCode.RESULT_OK后再执行queryPurchasesAsync。
    2. 避免在Activity生命周期早期(如onCreate未等待连接完成)或连接断开时发起查询。
  • 修复API常量与回调逻辑
    5.x中部分常量的引用方式有变化,你的代码存在混淆风险:

    • 必须使用BillingClient.BillingResponseCode.RESULT_OK和BillingClient.BillingResponseCode.RESULT_CANCELED,而非未限定的同名常量,避免与其他类的常量冲突。
    • 补充SERVICE_DISCONNECTED的分支处理,明确触发重连逻辑。
  • 检查依赖与权限

    1. 确认build.gradle中依赖的是5.x版本的Billing Library,例如:
      implementation 'com.android.billingclient:billing:5.2.0'
      
    2. 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:57:19