1. 程式人生 > >*#06*中所顯示IMEI和MEID號的客製化

*#06*中所顯示IMEI和MEID號的客製化

最近接到了一個產線反饋的問題,經過復現發現現象如下:在撥號介面輸入*#06#,插入移動聯通卡或者出現imei號正確,插入電信卡時出現的meid號是錯誤的,顯示的仍然是imei號,列印log後發現根本沒有獲取到meid號,但是手機是支援電信卡的,

上網搜尋一圈後發現基本給出的結果相同,都是通過手機管理器類的getDeviceId()來獲取的,官方文件也是這麼解釋,但是實際情況卻是不行,以下是網上提供的方法,但是驗證無效:

import android.telephony.TelephonyManager;

TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);

  /*  
   * 唯一的裝置ID:  
   * GSM手機的 IMEI 和 CDMA手機的 MEID.   
   * Return null if device ID is not available.  
   */   
  tm.getDeviceId();//String 
以上方法實測結果是隻能獲取到imei號,meid號始終獲取不到

若需要顯示meid號可使用下面的方法來解決:

1.修改 : alps/frameworks/opt/telephony/src/java/com/android/internal/telephony/cdma/CDMAPhone.java的 handlemessage()方法,在switch對應的case:EVENT_GET_DEVICE_IDENTITY_

DONE處理過程中,將讀到的mMeid儲存在SystemProperties中,這樣在開機初始化之後,MEID就都儲存到了SystemProperties中,在phone程序以及第三方APK中都可以通過SystemProperties獲取到它們。

SystemProperties.set("gsm.mtk.meid",mMeid);

2.修改:alps/packages/apps/Dialer/src/com/android/dialer/SpecialCharSequenceMgr.java

handleDeviceIdDisplay方法,直接通過SystemProperties可以獲取到1個MEID

imei號可使用tm.getDeviceId();//獲取

也可使用定製化的方法獲取,方法如下(類似meid號獲取):

在GSMPhone.java的handlemessage方法switch對應的case:EVENT_GET_IMEI_DONE處理過程中,將讀到的mImei儲存到SystemProperties中,可以根據slotId按如下例子的格式設鍵值(命名可跟公司名相關聯)。這樣在開機初始化之後,GSM Modem兩個protocol對應的IMEI就都儲存到了SystemProperties中,在phone程序以及第三方APK中都可以通過SystemProperties獲取到它們。

例如:

if(mPhoneId == PhoneConstants.SIM_ID_1|| mPhoneId = 10) //SIM1
{
    Log.d("abc","is SIM1,IMEI is:"+mImei);
    SystemProperties.set("gsm.mtk.imei1",mImei);
}
else if(mPhoneId == PhoneConstants.SIM_ID_2 || mPhoneId =11) //SIM2
{
    Log.d("abc","is SIM2,IMEI is:"+mImei);
    SystemProperties.set("gsm.mtk.imei2",mImei);
}


這樣就可以獲取到1MEID2IMEI然後再根據客製化需求,將其傳到dialog中顯示即可。