Android如何獲取雙卡手機IMEI
前言:
專案中有個統計付費廣告轉化率的需求,需要獲取使用者手機的IMEI。但是網上最常見的方法有坑,也就是TelephonyManager.getDeviceId(),這方法有可能獲取的是MEID或者空值。然後自己Google了下,發現搜出來的靠前的幾個答案都不能正確獲取到兩個IMEI值。然後看到TelephonyManager原始碼中getDeviceId()方法的下一個方法就是getImei()方法,只不過被系統隱藏掉了。運用反射呼叫一下,的確能獲取兩個IMEI值,故在此分享一下~~
背景:
一般的獲取IMEI的程式碼是這樣的
public static String getIMEI(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); Stringimei = telephonyManager.getDeviceId(); return imei; }
原始碼中的註釋已經說明了,這方法可能返回IMEI,也可能返回MEID。我用的華為返回的就是MEID。他還有個帶引數的方法getDeviceId(int slotId),這個slotId應該就是卡槽編號,可能也能獲取到雙卡手機的DeviceId,不過我沒嘗試,因為反正他返回的不一定是我想要的IMEI。
解決方法:
利用反射,把系統隱藏掉的getImei()調用出來。
/** * @param slotIdslotId為卡槽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了。