Android设备标识符的使用

时间:2022-09-01 16:51:27

设备ID(DeviceId)

  • 获取办法
     android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    String deviceId = tm.getDeviceId();
  • 当设备为手机时,返回设备的唯一ID。手机制式为 GSM 时,返回手机的 IMEI 。手机制式为 CDMA 时,返回手机的 MEID 或 ESN 。
  • 非电话设备或者 Device ID 不可用时,返回 null .
  • 属于比较稳定的设备标识符。
  • 需要 READ_PHONE_STATE 权限。 (Android 6.0 以上需要用户手动赋予该权限)。
  • 某些设备上该方法存在 Bug ,返回的结果可能是一串0或者一串*号。

Sim 序列号(Sim Serial Number)

  • 获取办法
     android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    String simSerialNum = tm.getSimSerialNumber();
  • 不同 Sim 卡的序列号不同.
  • Sim 卡序列号,当手机上装有 Sim 卡并且可用时,返回该值。手机未装 Sim 卡或者不可用时,返回 null.
  • 需要 READ_PHONE_STATE 权限。 (Android 6.0 以上需要用户手动赋予该权限)

Mac 地址(Mac Address)

  • 获取办法
     android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    String macAddress = wifi.getConnectionInfo().getMacAddress();
  • 没有 WiFi 硬件或者 WiFi 不可用的设备可能返回 null 或空,注意判空.
  • 比较稳定的硬件标识符。
  • 需要 ACCESS_WIFI_STATE 权限。

设备序列号(Serial Number, SN)

  • 获取办法:
     String serialNum = android.os.Build.SERIAL;
  • 比较稳定的设备硬件标识符,谷歌也未提到有啥缺点。

ANDROID_ID

  • 获取办法:
     String androidId = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
  • 在设备第一次启动的时候生成并保存,并且可能会在恢复出厂设置后重置该值。理论上是大部分是重置的。(API 中原话是:The value may change if a factory reset is performed on the device.)
  • 在 Android 2.2 中不可靠.
  • 部分设备由于制造商错误实现,导致会返回相同的 Android_ID.
  • 在 Android 4.2 及以上, 设备启用多用户功能后,每个用户的 Android_ID 不相同.

参考:

[1].http://www.jianshu.com/p/b6f4b0aca6b0?utm_campaign=haruki

[2].http://*.com/questions/2785485/is-there-a-unique-android-device-id/2853253#2853253