雙卡雙待 getDeviceId unique device ID IMEI 不唯一 會變問題
最近接到使用者反饋無法登入的情況越來越多,因為我們的app設計上是不能換手機用,也就是綁定了唯一的裝置ID。從反饋上來看,有一個線索是大部分是雙卡雙待的使用者出現這個問題,並且切換過SIM卡。看來getDeviceId這個方法在雙卡雙待手機上獲取IMEI還是有問題的。
getDeviceId方式的註釋:
Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available.
註釋上已經說明了獲取的IMEI不會絕對得唯一,GSM CDMA是sim卡網路制式,也就說getDeviceId會根據網路制式返回不同的IMEI,那我們要修正這個問題,就要獲取所有的IMEI。繼續看文件,果然,發現API版本23新增了一個方法 public String getDeviceId(int slotId),引數slotId文件沒有詳細寫應該怎麼填,檢視原始碼發現如下一段常量。
/** No phone radio. */ public static final int PHONE_TYPE_NONE = PhoneConstants.PHONE_TYPE_NONE; /** Phone radio is GSM. */ public static final int PHONE_TYPE_GSM = PhoneConstants.PHONE_TYPE_GSM; /** Phone radio is CDMA. */ public static final int PHONE_TYPE_CDMA = PhoneConstants.PHONE_TYPE_CDMA; /** Phone is via SIP. */ public static final int PHONE_TYPE_SIP = PhoneConstants.PHONE_TYPE_SIP;
這樣我們就能獲取所有的IMEI了,如下程式碼:
public static String getWholeImei() { String imeiStr = null,imeiStr1= ",",imeiStr2= ",",imeiStr3= ",",imeiStr4= ","; try { imeiStr = ((TelephonyManager) MyApp.getInstance() .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); imeiStr1 += ((TelephonyManager) MyApp.getInstance() .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(TelephonyManager.PHONE_TYPE_NONE); imeiStr2 += ((TelephonyManager) MyApp.getInstance() .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(TelephonyManager.PHONE_TYPE_GSM); imeiStr3 += ((TelephonyManager) MyApp.getInstance() .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(TelephonyManager.PHONE_TYPE_CDMA); imeiStr4 += ((TelephonyManager) MyApp.getInstance() .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(TelephonyManager.PHONE_TYPE_SIP); } catch (Throwable e) { e.printStackTrace(); } LogUtil.i(imeiStr+imeiStr1+imeiStr2+imeiStr3+imeiStr4); return imeiStr+=imeiStr1+=imeiStr2+=imeiStr3+=imeiStr4; }
需要注意的一點是 雖然API文件上顯示此方法是api23,也就是android L 6.0才加的,但是筆者在5.0以上的手機上都能呼叫,5.0以下才會報NoSuchMethod錯誤,所以最好的做法就是捕捉ERROR,避免app崩潰。
最後舉個例子上個結果:獲取到的IMEI:whole_imei=869315022916292,A000005E67BFA4,869315023576038,A000005E67BFA4,A000005E67BFA4
然後上個黑科技 手機撥號介面輸入*#06# 就能檢視IMEI MEID之類的資訊哦
證明我們獲得了本手機上的所有IMEI。