解决Android 11 获取不到Serial number方法
由于从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方法相关推荐
- android 组件大小,Android编程获取组件尺寸大小的方法
本文实例讲述了Android编程获取组件尺寸大小的方法.分享给大家供大家参考,具体如下: 在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽 ...
- android获取颜色资源,Android中获取颜色的几种方法
Android中获取颜色的几种方法: 通过android封装好的Color类中的常量 public static final int BLACK = 0xFF000000; public static ...
- Android 11获取应用列表 android.permission.QUERY_ALL_PACKAGES
有了这条语句的加持,在编译时 app的 targetSdkVersion 30就能像SDK29那样在安装列表中找到对应app.若没有,则不能根据应用包名查找是否安装该应用 <uses-permi ...
- Android中获取网络图片的三种方法
android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用 ...
- Android下获取FPS的几种方法
FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...
- android fps 获取,Android下获取FPS的几种方法
FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...
- android 11 获取Imeid,Iccid
平时可以使用以下代码进行获取imeid操作,但是还需要在源码中进行修改定制才能满足这个效果. /*** 获取IMEI 或者MEID* android.permission.READ_PRIVILEGE ...
- android中获取网页cookie的工具方法
1.应用场景 我自己的应用场景是,做一个股票分时图控件demo,需要抓取同花顺网站上的分时图数据,但是这个分时图数据的链接做了cookie校验,直接用httpurlconnection访问,返回403 ...
- Android 中获取网络下载速率的方法
文章目录 相关方法如下: // 获取应用程序的 uid public static int getAppUid() {int uid = -1;// KmApplication是我的自定义Applic ...
- Android 开发获取当前手机厂商的方法和获取允许后台活动权限
获取当前手机厂商: 1. if (checkPhoneFirm().equals(PhoneConstant.IS_HUAWEI)) {//华为 // getPermisstion("hua ...
最新文章
- grails 环境找不到java_home
- SQL Server数据库重命名、数据导出等若干问题
- 对硬连接与软件连接的理解
- 检索数据_9_返回的字段在某个范围内的数据
- 再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像
- 开源库Magicodes.Storage正式发布
- html图片上加水印,css给图片添加水印
- free -m 下的含义
- 外挂制作必备工具下载.
- make headers_install 用法
- QT菜单栏颜色与背景颜色设置
- 联想thinkpadE450笔记本电脑自带的键盘不停自动打\\\\\\
- eclipse安装angularjs
- 向上的箭头 html,css中怎么实现向上的箭头
- J-Link下载失败解决办法
- 信息系统项目管理师考试法律法规、行业标准、政策资料
- 全志A10加载无线网卡驱动
- 《追风筝的人》读后感
- 反卷积(Deconvolution)上采样(Upsampling)上池化(Unpooling)的区别——附翻译
- oracle jdbc驱动 ojdbc14-10.2.0.4.0.jar 网盘下载