Android8.0以下通常使用反射的方式读取SN号码

Class<?> c = Class.forName("android.os.SystemProperties");Method get = c.getMethod("get", String.class);String serial = (String) get.invoke(c, "ro.serialno");

Android升级到8.0之后再用此方法会一直报 Access denied finding property "ro.serialno"这个错,原因是android O为了更好的管理用户的隐私做了一些调整,比如说刚才的那个问题。并且说在Android的未来版本中,针对Android O的应用会将Build.SERIAL视为“设备序列号”,用Build.SERIAL获取了。小编在这里写了一个4.0-8.0+的设备的获取序列号的适配方法。

/**     * 获取手机序列号     *     * @return 手机序列号     */    @SuppressLint({"NewApi", "MissingPermission"})    public static String getSerialNumber() {        String serial = "";        try {            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//8.0+                serial = Build.SERIAL;            } else {//8.0-                Class<?> c = Class.forName("android.os.SystemProperties");                Method get = c.getMethod("get", String.class);                serial = (String) get.invoke(c, "ro.serialno");            }        } catch (Exception e) {            e.printStackTrace();            LogUtils.e("e", "读取设备序列号异常:" + e.toString());        }        return serial;    }

说完了Android8.0,再来说说Android9.0是如何获取序列号的

在用Android8.0的方法测试Android9.0拿到的SN为空,经过查官方AndroidP文档发现,Android9.0获取序列号需要用户授权READ_PHONE_STATE这个权限,所以就可以动态申请一下权限,除了这里,还有一个地方需要变动,那就是Build.SERIAL在Android8.0好使,在Android9.0就不好使了,不过也有对应的解决方案,就是用Build.getSerial();来获取

综上所述总结了一个Android4.4-Android9.0所有的适配获取SN的方法

/**     * 获取手机序列号     *     * @return 手机序列号     */    @SuppressLint({"NewApi", "MissingPermission"})    public static String getSerialNumber() {        String serial = "";        try {            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {//9.0+                serial = Build.getSerial();            } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//8.0+                serial = Build.SERIAL;            } else {//8.0-                Class<?> c = Class.forName("android.os.SystemProperties");                Method get = c.getMethod("get", String.class);                serial = (String) get.invoke(c, "ro.serialno");            }        } catch (Exception e) {            e.printStackTrace();            Log.e("e", "读取设备序列号异常:" + e.toString());        }        return serial;    }

有疑问或者哪里讲的不到位的可以联系下博主!

Android10目前暂无方案,如有可获取Android10的SN的童鞋可评论或者私聊博主共同研究!

更多相关文章

  1. Android之添加快捷方式(Shortcut)到手机桌面
  2. Android 设备监听网络状态变化
  3. 查看android系统设备信息
  4. Android 兼容获取Mac地址与手机信息工具
  5. 14、到底改如何区分android的平板、电视、手机
  6. Android Studio 2.3 在小米手机中 调试安装Apk失败
  7. 获得Android设备的唯一序列号(一)
  8. 在Cocos2d-x中处理Android 系统设备的Menu和Back按键的响应

随机推荐

  1. Android写文件到SDCard的一般过程和代码
  2. Android(安卓)studio 打包自定义命名apk
  3. Android通过HttpURLConnection上传多个文
  4. 一个java android 时钟 非常精致!android
  5. Android源代码下载过程及遇到的问题
  6. 如何隐藏Android4.0及以上版本的ActionBa
  7. Android设置拍照或者上传本地图片
  8. Error Installing APK
  9. Android之手机振动的设置
  10. Android:textView加载Html,只加载文字