Android如何獲取雙卡手機IMEI的方法示例
前言:
項目中有個統(tǒng)計付費廣告轉化率的需求,需要獲取用戶手機的IMEI。但是網上最常見的方法有坑,也就是TelephonyManager.getDeviceId(),這方法有可能獲取的是MEID或者空值。然后自己Google了下,發(fā)現(xiàn)搜出來的靠前的幾個答案都不能正確獲取到兩個IMEI值。然后看到TelephonyManager源碼中getDeviceId()方法的下一個方法就是getImei()方法,只不過被系統(tǒng)隱藏掉了。運用反射調用一下,的確能獲取兩個IMEI值,故在此分享一下~~
背景:
一般的獲取IMEI的代碼是這樣的
public static String getIMEI(Context context) {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = telephonyManager.getDeviceId();
return imei;
}
源碼中的注釋已經說明了,這方法可能返回IMEI,也可能返回MEID。我用的華為返回的就是MEID。他還有個帶參數(shù)的方法getDeviceId(int slotId),這個slotId應該就是卡槽編號,可能也能獲取到雙卡手機的DeviceId,不過我沒嘗試,因為反正他返回的不一定是我想要的IMEI。
解決方法:
利用反射,把系統(tǒng)隱藏掉的getImei()調用出來。
/**
* @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 "";
}
}
調用時,分別傳入0、1,就可以獲取到雙卡手機的IMEI了。
PS:獲取主卡的IMEI,IMSI,ICCI的方法
/**
* Author: liuqiang
* Time: 2017-08-14 15:28
* Description:
* <p>
* IMEI 與你的手機是綁定關系 用于區(qū)別移動終端設備
* IMSI 與你的手機卡是綁定關系 用于區(qū)別移動用戶的有效信息 IMSI是用戶的標識。
* ICCID ICCID是卡的標識,由20位數(shù)字組成
* ICCID只是用來區(qū)別SIM卡,不作接入網絡的鑒權認證。而IMSI在接入網絡的時候,會到運營商的服務器中進行驗證。
* 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);// 取得相關系統(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);
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android復選框CheckBox與開關按鈕Switch及單選按鈕RadioButton使用示例詳解
這篇文章主要介紹了Android復選框CheckBox與開關按鈕Switch及單選按鈕RadioButton使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09
詳解Android中Intent對象與Intent Filter過濾匹配過程
這篇文章主要介紹了Android中Intent對象與Intent Filter過濾匹配過程,感興趣的小伙伴們可以參考一下2015-12-12
Android使用ViewPager實現(xiàn)無限滑動效果
相信在大家開發(fā)Android的時候,我們常常用ViewPager來為自己的應用創(chuàng)建廣告條幅,并且常常會遇到ViewPager無限滑動這樣的需求。下面來一起看看吧。2016-09-09

