In-App-Billing V3库onActivityResult触发空指针异常问题排查
咱们先从你给出的错误栈入手分析:空指针异常出现在JSON解析环节,具体是调用了一个null字符串的length()方法,追踪到BillingProcessor.handleActivityResult的第932行——这说明库在处理Google Play返回的购买响应时,拿到了一个预期外的null值,直接去解析导致崩溃。
下面给你几个具体的排查方向和解决方案:
1. 补全BillingProcessor初始化的许可证密钥
你初始化BillingProcessor的代码是这样的:
bp = BillingProcessor.newBillingProcessor(this, null, this);
第二个参数是你在Google Play Console里获取的应用内结算许可证密钥。虽然测试内购官方文档说不需要密钥,但部分版本的BillingProcessor库对这个参数的null情况处理不完善,会导致后续解析响应时出错。建议你把正确的密钥填进去(从Google Play Console的「应用内结算」页面复制),再重新测试。
2. 升级BillingProcessor到最新稳定版
这个空指针看起来像是库本身的边界处理bug——当Google Play返回的响应数据不完整或者为空时,库没有做null判断就直接进行JSON解析。如果你用的是较旧版本的库,大概率已经有开发者反馈并修复了这个问题,升级到最新版应该能解决。
3. 加日志确认返回的Intent数据是否正常
你可以在onActivityResult里加一些日志,看看Google Play返回的data Intent是否正常,有没有缺失关键数据:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("BillingDebug", "请求码: " + requestCode + ", 结果码: " + resultCode + ", 数据Intent: " + (data == null ? "为空" : data.toString())); if (data != null) { Log.d("BillingDebug", "Intent附加数据: " + data.getExtras()); } if (!bp.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } }
通过日志能直接确认是Google Play返回的数据有问题,还是库的解析逻辑出了问题,方便进一步定位。
4. 测试其他测试商品ID
你现在用的是android.test.canceled,可以换其他官方测试ID试试,比如android.test.purchased(模拟购买成功)或者android.test.refunded(模拟退款),看看是否同样会触发异常。如果只有特定测试ID出问题,那可能是库对该测试场景的处理有问题;如果所有测试ID都出问题,那还是回到初始化或库版本的问题上。
5. 确认生命周期处理是否正确
你的onDestroy里已经调用了bp.release(),这部分没问题,但要确保BillingProcessor是在Activity的onCreate里初始化的,并且当屏幕旋转等配置变化时,要重新初始化(或者在Manifest里给Activity加android:configChanges避免重建),不过这个和当前的空指针关联不大,但也是内购配置的常见坑,顺便提一下。
总结
最有可能的原因是初始化时没传许可证密钥,导致库无法正确解析响应;其次是库版本太旧存在bug。先补全密钥并升级库,应该能解决这个问题。
内容的提问来源于stack exchange,提问作者ArclightOne

