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

在Android 29及更高版本中,通过官方API无法直接获取IMEI,但通过具备root权限的shell命令,可以在终端中获取IMEI。文章介绍了如何使用adb命令结合shell脚本在Android 10系统上获取IMEI,即使在系统更新或恢复出厂设置后。然而,这种方法需要root权限,并不适用于所有设备和场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

既然我们在终端中可以获取到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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值