TelephonyManager.getDeviceId(0) returns 个不同的结果

TelephonyManager.getDeviceId(0) returns different results

出于某些特定原因,我需要在我的 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 卡之间切换以支持 3G/4G。

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

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

有解决方法吗?

如你所说IMEI/Device id 被标记到 sim 插槽。

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

假设插槽 1 的 IMEI 是:123456789012345

插槽 2 的 IMEI 为:012500123456789

根据不同的情况,以下是 telephonyManagerObj.getDeviceId() 的 returned 值:

  1. 当您没有任何 SIM 卡时,该方法将为插槽 1 return IMEI,即 123456789012345
  2. 当插槽 1 中有 SIM 卡时,该方法将为插槽 1 return IMEI,即 123456789012345
  3. 当您在两个插槽中都有 SIM 卡时,该方法将为插槽 1 return IMEI,即 123456789012345
  4. 但是当你的 SIM 卡只在插槽 2 时,该方法将 return 插槽 2 的 IMEI 即 012500123456789
  5. 我发现在一台设备上,当我将 SIM 卡错误地插入插槽 1 时,方法 returned IMEI-SV

保持一致性的一种解决方法是在成功检索到 IMEI 后将其存储在 SharedPreference/Sqlite 中。

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

小心,getDeviceId() has been deprecated in Android O. Check this so备选