网站建设与规划结课论文,济宁网站建设公司公司,上海企业服务云官网,开发公司 张庆IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写#xff0c;由15-17位数字组成#xff0c;与手机是一一对应的关系。无论刷机还是恢复出厂设置#xff0c;该设备标识码都不会改变#xff0c;所以在广告和流量统计等方面特别好用#xff0c;备受…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的权限不然也获取不到imeipublic 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 pRuntime.getRuntime().exec(new String[]{su,-c,shell});BufferedReader brnew BufferedReader(new InputStreamReader(p.getInputStream()));String readLinebr.readLine();while(readLine!null){Log.d(execShell,readLine);return readLine.trim();}if(br!null){br.close();}p.destroy();pnull;} catch (IOException e) {e.printStackTrace();}return null;}如此我们便可以获取到手机的imei。作者凌塘链接https://juejin.cn/post/6953079991303143432著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。