Android getDeviceId(0)返回不同的结果

Android getDeviceId(0)返回不同的结果,android,imei,huawei-mobile-services,Android,Imei,Huawei Mobile Services,出于某些特定的原因,我需要在我的Android应用程序的某个点上获得IMEI。以下是我使用的代码: TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ // API available only >= 6.0

出于某些特定的原因,我需要在我的Android应用程序的某个点上获得IMEI。以下是我使用的代码:

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

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
    // API available only >= 6.0
    // Get first slot to avoid issue if we have multiple sim cards
    String imei = tm.getDeviceId(0);
}
else
{
    String imei = tm.getDeviceId();
}
它在大多数情况下工作正常。然而,一些设备(如华为荣誉7)提供双sim卡功能。在设置中,用户可以在两张SIM卡之间切换以支持3G/4G

当我有两张SIM卡并切换时,我得到的IMEI是不同的

据我所知,IMEI与物理插槽相关,不应更改。这看起来像是构造函数的错误实现


有什么解决办法吗?

正如您所说,IMEI/设备Id被标记到sim卡插槽

对于双SIM手机,有三个IMEI值(每个插槽一个)和IMEI-SV

假设插槽1的IMEI为:123456789012345

插槽2的IMEI为:012500123456789

根据场景的不同,以下是telephonyManagerObj.getDeviceId()返回的值:

  • 当您没有任何SIM卡时,该方法将返回slot1的IMEI,即123456789012345
  • 当您的SIM卡位于插槽1中时,该方法将返回插槽1的IMEI,即123456789012345
  • 当两个插槽中都有SIM卡时,该方法将返回插槽1的IMEI,即123456789012345
  • 但当您的SIM卡仅位于插槽2中时,该方法将返回插槽2中的IMEI,即012500123456789
  • 我发现在一台设备上,当我将SIM卡错误地插入插槽1时,该方法返回IMEI-SV
  • 维护一致性的一个解决方法是在成功检索IMEI后,将其存储在SharedReference/Sqlite中

    所以,当您在代码中需要IMEI值时,您可以首先检查它在本地存储中是否可用。如果不可用,则检索IMEI并将其存储以供下次使用


    请小心,Android O中已弃用。请检查备选方案

    谢谢您的精确性。看起来IMEI太不一致了,不能用作唯一的设备标识符。此外,如果你的目标是没有SIM卡插槽的平板电脑,就不会有任何IMEI。