Android应用内购仅手机端正常,Wear OS端存在回调及查询异常
Wear OS跨设备购买回调不触发问题排查
问题现象
应用在手机端单独安装时购买流程正常,但在Wear OS设备上存在以下异常:
- 通过手机端完成购买后,穿戴端的
onPurchasesUpdated回调不会被触发,无法确认购买状态 - 调用
queryPurchases始终返回空列表;queryPurchaseHistory能查询到购买记录,但该接口无法用于确认有效购买 - 仅在穿戴端主动取消购买流程时,
onPurchasesUpdated才会正常调用
代码示例:
billingClient = BillingClient.newBuilder(application) .setListener(this).enablePendingPurchases().build(); // 仅穿戴端取消时触发,手机端完成/取消均无回调 @Override public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) { // 处理购买结果逻辑 }
已尝试的排查动作:
- 使用Billing Library 5.1.0和4.1.0版本测试
- 采用授权测试账号进行验证
- 在2款手机、3款Wear OS手表上复现问题
- 谷歌官方示例代码"TrivialTestDrive"同样出现该异常
可能的解决方向
1. 确保跨设备应用的关联配置
Wear OS与手机的跨设备购买依赖应用的身份一致性:
- 手机端和穿戴端应用必须使用相同的包名和签名密钥
- 登录Google Play Console,在Wear OS应用的设置页面,确认已正确关联对应的手机端应用(需在同一开发者账号下)
2. 主动查询购买记录替代被动回调
跨设备场景下,穿戴端无法依赖onPurchasesUpdated接收手机端的购买通知,需主动拉取:
- 使用废弃方法
queryPurchases的替代接口queryPurchasesAsync,在BillingClient连接成功后立即执行查询:
订阅类型商品替换private void queryPurchasesAsync() { QueryPurchasesParams params = QueryPurchasesParams.newBuilder() .setProductType(BillingClient.SkuType.INAPP) .build(); billingClient.queryPurchasesAsync(params, (billingResult, purchases) -> { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !purchases.isEmpty()) { handleValidPurchases(purchases); } }); }SkuType.INAPP为SkuType.SUBS
3. 维护BillingClient的连接稳定性
跨设备同步可能因连接中断导致状态不同步,需确保BillingClient始终处于连接状态并主动重试:
billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@NonNull BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // 连接成功后立即查询购买记录 queryPurchasesAsync(); } } @Override public void onBillingServiceDisconnected() { // 断开连接后自动重试 billingClient.startConnection(this); } });
4. 处理Pending状态的购买
手机端完成的购买可能在穿戴端处于pending状态,需主动确认:
private void handleValidPurchases(List<Purchase> purchases) { for (Purchase purchase : purchases) { if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED && !purchase.isAcknowledged()) { AcknowledgePurchaseParams ackParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.acknowledgePurchase(ackParams, result -> { if (result.getResponseCode() == BillingClient.BillingResponseCode.OK) { // 购买确认完成,执行业务逻辑 } }); } } }
5. 规避同步延迟问题
Google Play跨设备购买状态同步存在一定延迟:
- 确保手机与穿戴设备登录同一Google账号,且网络连接正常
- 测试时,手机端完成购买后等待1-2分钟,再在穿戴端查询购买状态
- 确保测试商品已发布到Play Console的测试轨道(内部测试/封闭测试)
内容的提问来源于stack exchange,提问作者rylos
相关产品推荐
相关产品推荐

