记录android遇到的SecurityException
一、java.lang.SecurityException: getUniqueDeviceId: The user 10283 does not meet the requirements to access device identifiers.
问题原因:在android 10(对应sdk版本29)上利用TelephonyManager获取设备ID导致
代码:
TelephonyManager tm = (TelephonyManager)context.getSystemService("phone");
String imei = tm .getDeviceId();
解决:适配android 10,没有什么好的适配方法,但是可以不报错,只是获取的设备ID为空
1. app模块的AndroidManifest.xml文件中添加获取手机信息权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2. 在代码中动态申请权限:
ActivityCompat.requestPermissions(activity, YOUR_PERMISSIONS, YOUR_REQUEST_CODE);
二、 找不见native方法导致的SecurityException
场景:
在使用Mapbox的地图时,需要使用如下代码设置在mapbox网站申请的token:
Mapbox.getInstance(getApplicationContext(), YOUR_MAPBOX_ACCESS_TOKEN_GOES_HERE);
而我们使用的map-sdk没有使用官方提供的版本,而是在开源代码的基础上做了一些改动然后在打出aar包来使用map-sdk,在调用上面的方法时有时会找不到 NativeConnectivityListener.initialize()
这个native方法。
注意事项:
查看自己的map-sdk都有在哪些cpu类型上的适配,然后在app模块下的build.gradle中进行ndk下abi类型的设置,代码如下
android { xxxxxxxxxxxx defaultConfig { xxxxxxxxxxxxx /** * 1. armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它. * 2. arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。 * 3. armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。 * 4. x86: 平板、模拟器用得比较多。 * 5. x86_64: 64位的平板。 */ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64", "mips", "mips64" // abiFilters "armeabi", "armeabi-v7a" } } }
如上列举了七种abi类型,但是我们的map-sdk实际只有 armeabi
和 armeabi-v7a
,配置全了反而在有些机型上会报SecurityException,所以要根据自己实际情况设置。
- 尝试rebuild project
- 现在大部分的手机都用是arm64-v8a cpu类型的手机,例如小米9、华为p30、三星A6+,这种cpu是64位的,在运行项目时启动AndroidStudio安装目录下bin目录里的studio64.exe来编译项目,并且在历史列表中删掉记录重新打开尝试。
三、java.lang.SecurityException: Permission Denial: broadcastIntent() requesting a sticky broadcast from pid=16414, uid=10259 requires android.permission.BROADCAST_STICKY
错误中明确提出缺少什么权限,只需要在 AndroidManifest.xml
中添加相应权限即可,例如本例添加
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
四、java.lang.SecurityException: getSerial: The user 10304 does not meet the requirements to access device identifiers.
在Android 10上调用Build.getSerial()
时报的错,并且这时候android.permission.READ_PHONE_STATE
的权限是已经申请了的。
版权声明:本文为u012551120原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。