*#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中显示即可。




你可能感兴趣的:(android)