1、问题描述

今天在使用统一扫码SDK时,打开扫码界面之后停留了几秒,然后发现应用出现了崩溃现象,使用的移动设备是华为手机,系统是Android 12的系统,使用的API版本是31,崩溃日志如下图所示:

【FAQ】【统一扫码服务】Android12上使用扫码SDK出现崩溃:SecurityException: getDataNetworkTypeForSubscriber_Android

详细的报错日志贴在下方:

Html 代码

<div>android.os.Parcel.createExceptionOrNull(Parcel.java:2436) </div><div>android.os.Parcel.createException(Parcel.java:2420) </div><div>android.os.Parcel.readException(Parcel.java:2403) </div><div>android.os.Parcel.readException(Parcel.java:2345) </div><div>com.android.internal.telephony.ITelephony$Stub$Proxy.getNetworkTypeForSubscriber(ITelephony.java:9325) </div><div>android.telephony.TelephonyManager.getNetworkType(TelephonyManager.java:3002) </div><div>android.telephony.TelephonyManager.getNetworkType(TelephonyManager.java:2964)  </div><div>com.huawei.hms.mlkit.common.ha.d.b(HianalyticsLogUtils.java:68) </div><div>com.huawei.hms.mlkit.common.ha.HianalyticsLogProvider.logEnd(HianalyticsLogProvider.java:6315)  </div><div>com.huawei.hms.ml.camera.g$a.a(HiAnalyticsThread.java:109) </div><div>com.huawei.hms.ml.camera.g$a.handleMessage(HiAnalyticsThread.java:78) </div><div>android.os.Handler.dispatchMessage(Handler.java:109) </div><div>android.os.Looper.loopOnce(Looper.java:206) </div><div>android.os.Looper.loop(Looper.java:296) </div><div>com.huawei.hms.ml.camera.g.run(HiAnalyticsThread.java:51)</div>

【FAQ】【统一扫码服务】Android12上使用扫码SDK出现崩溃:SecurityException: getDataNetworkTypeForSubscriber_Android_02

2、问题分析

我们首先从日志上整体看下来,并没有涉及到具体的业务部分,根据日志我们可以初步判断这个崩溃应该是触发了系统的某个行为机制导致的,是属于系统行为。

然后结合这个异常信息:SecurityException: getDataNetworkTypeForSubscriber,我们去查找相关的资料看看这个异常究竟是什么就OK了。

getDataNetworkTypeForSubscriber:该异常是获取设备网络类型异常。

造成这个异常的原因是:在Android 11及其以上版本在获取设备网络类型时需要获取READ_PHONE_STATE权限,如果您的工程或者是第三方库没有声明READ_PHONE_STATE权限,由于该权限问题就会造成应用闪退。

3、解决方案

针对以上这个问题,我总结了以下三种解决方案,您可以针对自身的实际情况,选择自己认为最方便的一种方式进行使用,当然,我个人比较推荐的是第三种方案,下面跟着我一起来了解一下这三种方案的具体实现吧!

一、将项目的targetSdkVersion由30降到29及以下版本

即:将项目的目标设备版本调低(临时解决方案,不推荐)

二、升级第三方库

即:由第三方库内部处理该异常,因此需要升级第三方库的版本,但是这种操作需要协调第三方库的开发资源,如果第三方库已经不维护了,那么这种方案也不行了。

三、应用自身申请READ_PHONE_STATE权限

即:在AndroidManifest.xml文件中声明READ_PHONE_STATE权限,然后在代码中动态申请该权限:

【FAQ】【统一扫码服务】Android12上使用扫码SDK出现崩溃:SecurityException: getDataNetworkTypeForSubscriber_统一扫码服务_03

【FAQ】【统一扫码服务】Android12上使用扫码SDK出现崩溃:SecurityException: getDataNetworkTypeForSubscriber_Android_04

OK,通过上面的方法,我们就可以完美的解决这个问题了!


欲了解更多更全技术文章,欢迎访问​​https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh​