1. 程式人生 > >雙卡雙待 getDeviceId unique device ID IMEI 不唯一 會變問題

雙卡雙待 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。