启动ProxyBillingActivity时触发PendingIntent.getIntentSender()空指针异常求助
解决ProxyBillingActivity启动时的PendingIntent空指针异常
核心原因
这个异常是因为发起内购请求时,BillingClient返回的PendingIntent为空,导致启动ProxyBillingActivity时调用getIntentSender()触发空指针。以下是针对性的排查和解决步骤:
1. 确保BillingClient连接状态正常
- 必须在BillingClient连接成功后再发起购买请求:
BillingClient billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build(); billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // 连接成功后,再查询商品、发起购买 querySkuDetails(); } } @Override public void onBillingServiceDisconnected() { // 实现重新连接逻辑 } }); - 禁止在连接未完成或断开时调用
launchBillingFlow,否则会返回空的PendingIntent。
2. 校验商品配置与应用信息一致性
- 检查Google Play Console内的商品状态:必须是已发布状态(草稿/未发布商品无法生成购买意图),且商品ID与代码中使用的完全一致(大小写、拼写严格匹配)。
- 确认应用的包名、签名证书与Play Console中注册的完全一致:签名不匹配会导致BillingClient无法获取商品数据,返回空PendingIntent。
3. 规范购买请求的调用逻辑
- 发起购买前必须确保
SkuDetails对象不为空:// 查询到有效SkuDetails后再发起购买 if (skuDetails != null) { BillingFlowParams params = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .build(); BillingResult result = billingClient.launchBillingFlow(activity, params); } - 必须使用有效且未销毁的Activity上下文调用
launchBillingFlow,禁止使用Application Context或已finish的Activity。
4. 升级BillingClient依赖版本
部分旧版本BillingClient存在特定系统下的PendingIntent空指针bug,建议升级到最新稳定版:
dependencies { implementation 'com.android.billingclient:billing:6.1.0' // 替换为当前最新稳定版 }
5. 排查测试环境问题
- 确保测试设备使用的Google账号已添加到Play Console的测试账号列表中,未授权的账号无法发起测试购买。
- 检查设备的Google Play服务是否为最新版本:旧版本Play服务可能导致BillingClient交互异常。
6. 增加防御性代码
在调用launchBillingFlow前主动检查PendingIntent是否为空(部分场景下即使连接正常也可能返回空):
// 针对旧版BillingClient的BuyIntent获取方式 PendingIntent buyIntent = skuDetails.getBuyIntent(BillingClient.SkuType.INAPP, "your_sku_id", "your_developer_payload"); if (buyIntent != null) { // 发起购买流程 } else { // 提示用户购买失败,或触发重试逻辑 }
内容的提问来源于stack exchange,提问作者user19896027
相关产品推荐
相关产品推荐

