由于从Android10开始采用沙盒存储模式以及权限策略的更新,导致适配的过程中获取不到种种的问题。由此分析下获取不到序列号的方法思路:

一、R的适配

1.从8.0开始获取SN的方法就是如下代码:

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {serialNumber = Build.getSerial();LOGE.E("serialNumber + " + serialNumber);}

然而,通过该方法在11上还是不奏效。

2.点击 serialNumber = Build.getSerial();方法中的Build查看了下源码,需要申请以下权限,

android.permission.READ_PHONE_STATE

经过申请权限后还是不能获取。。。。

3.紧接着,去看下系统源码,先查看了frameworks/base/core/java/android/os/Build.java,其中代码有以下定义。最主要的是IDeviceIdentifiersPolicyService对其获取的定义。

    @SuppressAutoDoc // No support for device / profile owner.@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)public static String getSerial() {IDeviceIdentifiersPolicyService service = IDeviceIdentifiersPolicyService.Stub.asInterface(ServiceManager.getService(Context.DEVICE_IDENTIFIERS_SERVICE));try {Application application = ActivityThread.currentApplication();String callingPackage = application != null ? application.getPackageName() : null;return service.getSerialForPackage(callingPackage, null);} catch (RemoteException e) {e.rethrowFromSystemServer();}return UNKNOWN;}

4.跟踪源码一路看下去。

frameworks/base/services/core/java/com/android/server/os/DeviceIdentifiersPolicyService.java

        @Overridepublic @Nullable String getSerial() throws RemoteException {// Since this invocation is on the server side a null value is used for the// callingPackage as the server's package name (typically android) should not be used// for any device / profile owner checks. The majority of requests for the serial number// should use the getSerialForPackage method with the calling package specified.if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mContext,/* callingPackage */ null, null, "getSerial")) {return Build.UNKNOWN;}return SystemProperties.get("ro.serialno", Build.UNKNOWN);}@Overridepublic @Nullable String getSerialForPackage(String callingPackage,String callingFeatureId) throws RemoteException {if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mContext,callingPackage, callingFeatureId, "getSerial")) {return Build.UNKNOWN;}return SystemProperties.get("ro.serialno", Build.UNKNOWN);}

此时,你会发现对与SN号的获取有这个两个方法限制,造成获取时一直是UNKNOWN的状态。如果,粗暴点修改让应用获取到SN号那就直接注释以下代码:

        public @Nullable String getSerialForPackage(String callingPackage,String callingFeatureId) throws RemoteException {// if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mContext,//         callingPackage, callingFeatureId, "getSerial")) {//     return Build.UNKNOWN;// }return SystemProperties.get("ro.serialno", Build.UNKNOWN);}}

如若,合理美观只让特定的应用获取就需要对callingPackage字段的包名进行判断即可。至此结束,每天成长一点就是最好的,加油自己!

解决Android 11 获取不到Serial number方法相关推荐

  1. android 组件大小,Android编程获取组件尺寸大小的方法

    本文实例讲述了Android编程获取组件尺寸大小的方法.分享给大家供大家参考,具体如下: 在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽 ...

  2. android获取颜色资源,Android中获取颜色的几种方法

    Android中获取颜色的几种方法: 通过android封装好的Color类中的常量 public static final int BLACK = 0xFF000000; public static ...

  3. Android 11获取应用列表 android.permission.QUERY_ALL_PACKAGES

    有了这条语句的加持,在编译时 app的 targetSdkVersion 30就能像SDK29那样在安装列表中找到对应app.若没有,则不能根据应用包名查找是否安装该应用 <uses-permi ...

  4. Android中获取网络图片的三种方法

    android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用 ...

  5. Android下获取FPS的几种方法

    FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...

  6. android fps 获取,Android下获取FPS的几种方法

    FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...

  7. android 11 获取Imeid,Iccid

    平时可以使用以下代码进行获取imeid操作,但是还需要在源码中进行修改定制才能满足这个效果. /*** 获取IMEI 或者MEID* android.permission.READ_PRIVILEGE ...

  8. android中获取网页cookie的工具方法

    1.应用场景 我自己的应用场景是,做一个股票分时图控件demo,需要抓取同花顺网站上的分时图数据,但是这个分时图数据的链接做了cookie校验,直接用httpurlconnection访问,返回403 ...

  9. Android 中获取网络下载速率的方法

    文章目录 相关方法如下: // 获取应用程序的 uid public static int getAppUid() {int uid = -1;// KmApplication是我的自定义Applic ...

  10. Android 开发获取当前手机厂商的方法和获取允许后台活动权限

    获取当前手机厂商: 1. if (checkPhoneFirm().equals(PhoneConstant.IS_HUAWEI)) {//华为 // getPermisstion("hua ...

最新文章

  1. grails 环境找不到java_home
  2. SQL Server数据库重命名、数据导出等若干问题
  3. 对硬连接与软件连接的理解
  4. 检索数据_9_返回的字段在某个范围内的数据
  5. 再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像
  6. 开源库Magicodes.Storage正式发布
  7. html图片上加水印,css给图片添加水印
  8. free -m 下的含义
  9. 外挂制作必备工具下载.
  10. make headers_install 用法
  11. QT菜单栏颜色与背景颜色设置
  12. 联想thinkpadE450笔记本电脑自带的键盘不停自动打\\\\\\
  13. eclipse安装angularjs
  14. 向上的箭头 html,css中怎么实现向上的箭头
  15. J-Link下载失败解决办法
  16. 信息系统项目管理师考试法律法规、行业标准、政策资料
  17. 全志A10加载无线网卡驱动
  18. 《追风筝的人》读后感
  19. 反卷积(Deconvolution)上采样(Upsampling)上池化(Unpooling)的区别——附翻译
  20. oracle jdbc驱动 ojdbc14-10.2.0.4.0.jar 网盘下载

热门文章

  1. canvas+websocket+vue做一个你画我猜小游戏
  2. 7种不同的数据标准化(归一化)方法总结
  3. groovy脚本一键360加固多渠道打包
  4. 星环大数据使用经验总结
  5. java 实现屏幕录像_用JAVA捕获屏幕、屏幕录像、播放
  6. filenet骗局_将FileNet P8与J2EE消息传递基础结构集成
  7. java md5,md2,md4 加密算法
  8. 软件可靠性方法 学习笔记
  9. RGB转YCbCr422_BT709颜色空间转换仿真
  10. Oracle密码过期解决办法