记录android遇到的SecurityException

记录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方法。

注意事项:

  1. 查看自己的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实际只有 armeabiarmeabi-v7a ,配置全了反而在有些机型上会报SecurityException,所以要根据自己实际情况设置。

  1. 尝试rebuild project
  2. 现在大部分的手机都用是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版权协议,转载请附上原文出处链接和本声明。