TelephonyManager.getDeviceId(0)返回不同的结果

时间:2018-01-17 16:22:03

标签: android imei huawei

由于某些特定原因,我需要在我的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();
}

在大多数情况下都可以正常工作。然而,一些设备(如华为Honor 7)提供双SIM卡功能。在设置中,用户可以在两张SIM卡之间切换以获得3G / 4G支持。

当我有两张SIM卡并进行切换时,我得到的IMEI就不同了。

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

有任何解决方法吗?

1 个答案:

答案 0 :(得分:1)

正如您所说,IMEI /设备ID被标记为SIM卡插槽。

对于双SIM卡电话,有三个IMEI值(每个插槽一个)和IMEI-SV。

我们说插槽1的IMEI是:123456789012345

插槽2的IMEI是:012500123456789

取决于方案,以下是telephonyManagerObj.getDeviceId()返回的值:

  1. 如果您没有任何SIM卡,该方法将返回插槽1的IMEI,即123456789012345
  2. 当你在插槽1中有SIM卡时,该方法将返回插槽1的IMEI,即123456789012345
  3. 当您在两个插槽中都有SIM卡时,该方法将返回插槽1的IMEI,即123456789012345
  4. 但是当您在插槽2中只有SIM卡时,该方法将返回插槽2的IMEI,即012500123456789
  5. 我发现在插槽1中错误插入SIM卡时,在一台设备上,该方法返回IMEI-SV
  6. 保持一致性的一个方法是在成功设法检索IMEI后将其存储在SharedPreference / Sqlite中。

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

    请注意,Android O中已弃用getDeviceId()。请检查this so以获取替代