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

2024-03-13

由于某些特定原因,我需要在 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/设备 ID 已标记到 sim 插槽。

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

假设插槽 1 的 IMEI 为:123456789012345

插槽 2 的 IMEI 为:012500123456789

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

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

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

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

当心,获取设备ID() https://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId()已在 Android O 中弃用。检查this so https://stackoverflow.com/questions/46744104/tm-getdeviceid-is-deprecated用于替代

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TelephonyManager.getDeviceId(0) 返回不同的结果 的相关文章

随机推荐