Nexus 5X使用Billing 4.0.0支付时报空指针异常的原因及解决办法
问题产生原因
这个异常是Google BillingClient 4.0.0版本的已知兼容性缺陷,仅在搭载Android 8.0/8.1系统的Nexus 5X设备上触发,根因如下:
- 4.0.0版本的Billing库未对购买流程返回的PendingIntent做非空校验,Nexus 5X设备上低于16.x版本的Google Play服务处理购买请求时,偶现无法生成有效PendingIntent的情况,
ProxyBillingActivity初始化时直接调用空对象的getIntentSender()方法,直接触发空指针崩溃。 - Nexus 5X官方最高支持的系统版本为Android 8.1,该系统版本对PendingIntent的传递逻辑存在特殊处理,当Billing库发起的购买请求参数未完全匹配系统预期时,也会导致PendingIntent返回为空。
解决方案
方案1:升级Billing库(优先选择)
Google在4.1.0及更高版本的Billing库中已经修复了该问题,直接修改依赖版本即可,不需要调整现有业务代码:
implementation 'com.android.billingclient:billing:4.1.0' implementation 'com.android.billingclient:billing-ktx:4.1.0'
升级后库内部会自动对PendingIntent做非空校验,空值场景会直接返回错误码,不会触发崩溃。
方案2:临时兼容方案(无法升级库时使用)
如果当前业务暂时无法升级Billing库版本,可以通过以下逻辑规避崩溃:
- 发起购买请求前先判断当前设备是否是Nexus 5X且系统版本为Android 8.x,同时校验Google Play服务版本不低于16.0.0,不满足条件时提前给出友好提示,不发起购买流程。
- 调用
launchBillingFlow()后检查返回的响应码,如果返回错误状态直接终止流程,不要继续后续操作。 - 在AndroidManifest.xml中主动配置ProxyBillingActivity的属性,避免状态丢失:
<activity android:name="com.android.billingclient.api.ProxyBillingActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:exported="false" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
内容的提问来源于stack exchange,提问作者Ильин Павел
相关产品推荐
相关产品推荐

