Android如何獲取雙卡手機IMEI的方法示例
前言:
項目中有個統(tǒng)計付費廣告轉(zhuǎn)化率的需求,需要獲取用戶手機的IMEI。但是網(wǎng)上最常見的方法有坑,也就是TelephonyManager.getDeviceId(),這方法有可能獲取的是MEID或者空值。然后自己Google了下,發(fā)現(xiàn)搜出來的靠前的幾個答案都不能正確獲取到兩個IMEI值。然后看到TelephonyManager源碼中g(shù)etDeviceId()方法的下一個方法就是getImei()方法,只不過被系統(tǒng)隱藏掉了。運用反射調(diào)用一下,的確能獲取兩個IMEI值,故在此分享一下~~
背景:
一般的獲取IMEI的代碼是這樣的
public static String getIMEI(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String imei = telephonyManager.getDeviceId(); return imei; }
源碼中的注釋已經(jīng)說明了,這方法可能返回IMEI,也可能返回MEID。我用的華為返回的就是MEID。他還有個帶參數(shù)的方法getDeviceId(int slotId),這個slotId應該就是卡槽編號,可能也能獲取到雙卡手機的DeviceId,不過我沒嘗試,因為反正他返回的不一定是我想要的IMEI。
解決方法:
利用反射,把系統(tǒng)隱藏掉的getImei()調(diào)用出來。
/** * @param slotId slotId為卡槽Id,它的值為 0、1; * @return */ public static String getIMEI(Context context, int slotId) { try { TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); Method method = manager.getClass().getMethod("getImei", int.class); String imei = (String) method.invoke(manager, slotId); return imei; } catch (Exception e) { return ""; } }
調(diào)用時,分別傳入0、1,就可以獲取到雙卡手機的IMEI了。
PS:獲取主卡的IMEI,IMSI,ICCI的方法
/** * Author: liuqiang * Time: 2017-08-14 15:28 * Description: * <p> * IMEI 與你的手機是綁定關(guān)系 用于區(qū)別移動終端設備 * IMSI 與你的手機卡是綁定關(guān)系 用于區(qū)別移動用戶的有效信息 IMSI是用戶的標識。 * ICCID ICCID是卡的標識,由20位數(shù)字組成 * ICCID只是用來區(qū)別SIM卡,不作接入網(wǎng)絡的鑒權(quán)認證。而IMSI在接入網(wǎng)絡的時候,會到運營商的服務器中進行驗證。 * https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/TelephonyManager.java */ @RequiresApi(api = Build.VERSION_CODES.O) public void check(View view) { TelephonyManager telephonyManager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE);// 取得相關(guān)系統(tǒng)服務 String simOperatorName = telephonyManager.getSimOperatorName(); String imei = telephonyManager.getDeviceId(); //取出 IMEI String imeiAPI26 = telephonyManager.getImei(); //取出 IMEI 需要 api26以上 String tel = telephonyManager.getLine1Number(); //取出 MSISDN,很可能為空 String imsi = telephonyManager.getSubscriberId(); //取出 IMSI String icc = telephonyManager.getSimSerialNumber(); //取出 ICCID Log.d("Q_M", "運行商名字--" + simOperatorName); Log.d("Q_M", "IMEI--" + imei); Log.d("Q_M", "IMEI_API26--" + imeiAPI26); Log.d("Q_M", "IMSI--" + imsi); Log.d("Q_M", "ICCID--" + icc); }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android復選框CheckBox與開關(guān)按鈕Switch及單選按鈕RadioButton使用示例詳解
這篇文章主要介紹了Android復選框CheckBox與開關(guān)按鈕Switch及單選按鈕RadioButton使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09詳解Android中Intent對象與Intent Filter過濾匹配過程
這篇文章主要介紹了Android中Intent對象與Intent Filter過濾匹配過程,感興趣的小伙伴們可以參考一下2015-12-12Android如何判斷一個點在不在多邊形區(qū)域內(nèi)
這篇文章主要為大家詳細介紹了Android判斷一個點在不在多邊形區(qū)域內(nèi)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Android使用ViewPager實現(xiàn)無限滑動效果
相信在大家開發(fā)Android的時候,我們常常用ViewPager來為自己的應用創(chuàng)建廣告條幅,并且常常會遇到ViewPager無限滑動這樣的需求。下面來一起看看吧。2016-09-092013年 移動App設計13項注意細節(jié)總結(jié)
在過去的一年里,移動成主流也讓眾多的移動應用如雨后春筍般層出不窮,在眾多開發(fā)者從中獲利的同時競爭也愈演愈烈,如何才能保證自己立于不敗之地接下來介紹移動App設計的13大精髓感興趣的朋友可以了解下啊2013-01-01