android10获取imei,Android 10 root用户获取imei
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言用数组实现栈的插入,C语言静态数组
- 下一篇: 教师查询系统C语言,教师管理系统c语言版