IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写,由15-17位数字组成,与手机是一一对应的关系。无论刷机还是恢复出厂设置,该设备标识码都不会改变,所以在广告和流量统计等方面特别好用,备受开发者的青睐。

但自从android29之后,通android api的TelephonyManager提供的getImei方法已经无法获取到手机的imei了,那我们又该如何获取的手机的唯一设备标识符呢?

Android开发者文档提供的方式是Android Id,这种获取的方式在大多时候确实是有效的,能满足常规的广告统计需要,但如果遇到手机刷机、系统升级或者恢复出厂后,这个id就会被重置,所以在某些业务场景下(例如要将设备标识作为用户唯一id),就显得捉襟见肘了。

网上有一些解决方案,大多是用mac地址,UUid,或者针对特定的手机厂商去生成唯一标识,那我们真的在android 10系统中就拿不到手机的imei了吗?答案是否定的,例如在root权限下,我们就可以绕过android的api,直接拿到手机的imei。

笔者假设用户的手机已经root,并且已经将手机用android调试桥连接到电脑上去,那我们在电脑终端输入adb命令,便可将手机的imei打印出来:

adb shell service call iphonesubinfo 1

我们不妨通过正则表达式,将获取到的imei匹配出来:

adb shell service call iphonesubinfo 3 i32 1 | awk -F "'" '{print $2}' | sed '1 d' | tr -d '.' | awk '{print}' ORS=

既然我们在终端中可以获取到imei,那我们只需要把这个命令作为shell,在代码里运行即可,但是需要su的权限,不然也获取不到imei:

public static String getImeiByShell(){

try {

String shell = "service call iphonesubinfo 3 i32 1 | awk -F \"'\" '{print $2}' | sed '1 d' | tr -d '.' | awk '{print}' ORS=";

Process p=Runtime.getRuntime().exec(new String[]{"su","-c",shell});

BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));

String readLine=br.readLine();

while(readLine!=null){

Log.d("execShell",readLine);

return readLine.trim();

}

if(br!=null){

br.close();

}

p.destroy();

p=null;

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

如此,我们便可以获取到手机的imei。

作者:凌塘

链接:https://juejin.cn/post/6953079991303143432

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

android10获取imei,Android 10 root用户获取imei相关推荐

  1. android10 imei横线,Android 10 root用户获取imei

    IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写,由15-17位数字组成,与手机是一一对应的关系.无论刷机还是恢复出厂设置,该设备标 ...

  2. Android多个imei如何获取,如何在Android 10中获取IMEI号,这是获取在Android 10及以下Android 10中获取IMEI号的代码...

    如何在android 10中获取imei编号,这是获取在android 10及以下android 10中获取imei编号的代码. if (android.os.Build.VERSION.SDK_IN ...

  3. Android 10 已无法获取SN序列号

    由于Android 10 已无法正常获取SN / IMEI,会抛出SecurityException错误. 为了多设备多版本通用,以下代码屏蔽了10以上的设备,避免报错. public static ...

  4. android10唯一识别,Android 10 如何获取唯一值?

    floyda: Android 10 如何获取唯一值? 1.自己拼一个 uuid, 这个方法不是谷歌官方给予了设备唯一 ID 最佳做法(至少我在官方文档中找不到), 如果还原出厂设置, uuid 会改 ...

  5. android电视root权限获取,电视盒子/ 智能电视如何通过ADB获取ROOT权限?

    如何通过adb获取root权限(安卓电视盒和智能电视通用)? Android 系统rom里面最主要的就3个文件:boot.img.system.img.userdata.img 其中boot.img ...

  6. android临时root权限获取失败,获取ROOT权限失败怎么办?

    Android手机Root失败原 今Android平台便ROOT 式键ROOT用户通发 者提供ROOT工具简单快捷实现 ROOT包括腾讯手 机关机.360手机助 手.卓师.刷机精灵卓师甜椒及移叔叔 R ...

  7. android魅族手机目录获取,根据ANDROID 10的魅族手机FLYME 8.1已公布:下列是达标机器设备的目录...

    魅族17系列产物近期与按照Android 10的Flyme 8.1固定件一路公布发布.新固定件已展开了良多改良,包括新的OneMind 4.0 AI模块. 主题勾当期内,大师都晓得此外十款魅族手机机械 ...

  8. android tmp目录权限不够,android - 使用root用户安装APK,处理“ / data / local / tmp /”文件夹的新限制 - 堆栈内存溢出...

    背景 到目前为止,我可以通过以下代码使用root(在应用程序内)安装APK文件: pm install -t -f fullPathToApkFile 并且如果我想(尝试)安装到sd-card: pm ...

  9. Ubuntu12.10 root用户登录设置

    ubuntu12.10默认不允许root用户登录,在登录窗口只能看到普通用户和访客登录. 以普通身份登陆ubuntu后,我们需要做一些修改 普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终 ...

最新文章

  1. 服务器php 启动命令_禁止php运行服务器命令行函数的安全配置
  2. download在线下载源码
  3. python函数基本概念_python——函数的基本概念
  4. mybatis 配置_配置Mybatis在Spring Boot工程中的整合
  5. Flume之介绍 核心组件 可靠性 恢复性
  6. 高速计算机的应用领域概括,河北计算机一级考试题-MS模拟试题
  7. php 继承 父类使用子类,PHP父类调用子类方法实例
  8. 在线扒站工具, 扒站网站工具(简单、快捷、免费)
  9. NN求解NS方程进一步探讨
  10. Android color颜色-色号总结
  11. 92年程序员发帖晒薪资称自己很迷茫,网友:老弟你可以了
  12. 多标签图像分类总结(转载)
  13. mysql报错You do not have the SUPER privilege and binary logging is enabled
  14. kubeadm reset重新初始化过程
  15. Hibernate笔记+相关面试题
  16. MindSpore联邦学习框架解决行业级难题
  17. 机器学习助推分子动力学模拟
  18. Matlab 断供哈工大,国产替代软件挺身而出,霸气!
  19. 在处理时有错误发生: sogoupinyin
  20. 阿里云轻量应用服务器可以加数据盘吗?

热门文章

  1. linux下php的安装,Linux下PHP安装
  2. 内部导线拉力测试_珠海后环回收试验机现金支付拉力试验机回收和谐温馨的环境...
  3. activemq nodejs stomp 重连机制_5分钟优劣分析 Kafka、RabbitMQ、RocketMQ、ActiveMQ消息队列...
  4. Google Guava,牛逼的脚手架
  5. Java中常用的4个Json库,哪个性能更牛逼?
  6. Java核心(五)深入理解BIO、NIO、AIO
  7. 如何在使用ASPMVC4的分部视图中获取数据展示
  8. mysql中int、bigint、smallint 和 tinyint的区别与长度
  9. Python 代码优化常见技巧
  10. php对数组进行合成的函数,php合并数组函数array_merge()