如何获取Android设备唯一识别码

来自:http://syawlaus.com/remindme-%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96android%E8%AE%BE%E5%A4%87%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81%EF%BC%9F/

如果我们想唯一识别一台Android设备,就需要获取设备的唯一识别码。怎么获取呢?

下面是Android设备一些可供选择的唯一识别码及其适用范围:

IMEI (International Mobile Equipment Identity Number,国际移动设备识别码)

  • 用于在手机网络中识别每一部独立的手机
  • 对于不在手机网络的设备(如Android平板),就不能使用IMEI来识别。

IMSI (International Mobile Subscriber Identity,国际移动用户识别码)

  • 它是在公众陆地移动电话网(PLMN)中用于唯一识别移动用户的一个号码,在GSM网络,这个号码通常被存放在SIM卡中
  • 跟IMEI一样,对于不在手机网络的设备就不能使用IMSI来识别。

Android ID

  • 64位的十六进制字符串,设备首次启动时会随时生成
  • 如果设备恢复了出厂设置,这个值可能会改变
  • 设备root了之后,这个值可以手动修改
  • Android 2.2发现bug,部分设备具有相同Android ID(9774d56d682e549c),模拟器的Android ID也是这个
  • 这个值有时会为null
  • 一般不推荐使用

Java
1 2 private String androidId = Secure . getString ( getContext ( ) . getContentResolver ( ) ,      Secure . ANDROID_ID ) ;

Device ID

  • 唯一的设备ID,如GSM网络的IMEI,CDMA网络的MEID / ESN,可能返回null(API文档的描述)
  • 只对手机设备有效,对于不在手机网络的设备,会返回null
  • 获取到的Device ID值,即使设备恢复出厂设置也不会改变
  • 需要READ_PHONE_STATE权限
  • 某些设备的Device ID实现有bug,会返回0或*

Java
1 2 TelephonyManager tm = ( TelephonyManager ) getSystemService ( TELEPHONY_SERVICE ) ; String deviceId = tm . getDeviceId ( ) ;

Serial Number

  • 从Android 2.3开始(API level 9),可以通过android.os.Build.SERIAL获取
  • 需要READ_PHONE_STATE权限

WiFi MAC  Address

  • 不是所有Android设备都有WiFi
  • 对于有WiFi的设备,如果WiFi没有开启,可能获取不了WiFi MAC地址
  • 需要ACCESS_WIFI_STATE权限

Java
1 2 WifiManager wm = ( WifiManager ) Context . getSystemService ( Context . WIFI_SERVICE ) ; String wifiMac = wm . getConnectionInfo ( ) . getMacAddress ( ) ;

BlueTooth MAC Address

  • 如果没有开启BlueTooth,可能获取不了BlueTooth MAC地址
  • 需要BLUETOOTH权限

Java
1 2 3 BluetoothAdapter bluetoothAdapter = null ;    // Local Bluetooth adapter bluetoothAdapter = BluetoothAdapter . getDefaultAdapter ( ) ; String bluetoothMac = bluetoothAdapter . getAddress ( ) ;

UUID(Universally unique identifier,通用唯一标识符)

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 // 方法1 public class Installation {      private static String sID = null ;      private static final String INSTALLATION = "INSTALLATION" ;      public synchronized static String id ( Context context ) {          if ( sID == null ) {                 File installation = new File ( context . getFilesDir ( ) , INSTALLATION ) ;              try {                  if ( ! installation . exists ( ) )                      writeInstallationFile ( installation ) ;                  sID = readInstallationFile ( installation ) ;              } catch ( Exception e ) {                  throw new RuntimeException ( e ) ;              }          }          return sID ;      }      private static String readInstallationFile ( File installation ) throws IOException {          RandomAccessFile f = new RandomAccessFile ( installation , "r" ) ;          byte [ ] bytes = new byte [ ( int ) f . length ( ) ] ;          f . readFully ( bytes ) ;          f . close ( ) ;          return new String ( bytes ) ;      }      private static void writeInstallationFile ( File installation ) throws IOException {          FileOutputStream out = new FileOutputStream ( installation ) ;          String id = UUID . randomUUID ( ) . toString ( ) ;          out . write ( id . getBytes ( ) ) ;          out . close ( ) ;      } }

Java
1 2 3 4 5 6 7 8 9 10 11 12 // 方法2 TelephonyManager tm = ( TelephonyManager ) getBaseContext ( ) . getSystemService ( Context . TELEPHONY_SERVICE ) ; final String DeviceId , SerialNum , androidId ; DeviceId = tm . getDeviceId ( ) ; SerialNum = tm . getSimSerialNumber ( ) ; androidId = Secure . getString ( getContentResolver ( ) , Secure . ANDROID_ID ) ; UUID deviceUuid = new UUID ( androidId . hashCode ( ) , ( ( long ) DeviceId . hashCode ( ) << 32 ) | SerialNum . hashCode ( ) ) ; String mydeviceId = deviceUuid . toString ( ) ; Log . v ( "My Id" , "Android DeviceId is: " + DeviceId ) ; Log . v ( "My Id" , "Android SerialNum is: " + SerialNum ) ; Log . v ( "My Id" , "Android androidId is: " + androidId ) ;

Java
1 2 3 4 5 6 7 8 9 // 方法3 final TelephonyManager tm = ( TelephonyManager ) getBaseContext ( ) . getSystemService ( Context . TELEPHONY_SERVICE ) ; final String tmDevice , tmSerial , androidId ; tmDevice = "" + tm . getDeviceId ( ) ; tmSerial = "" + tm . getSimSerialNumber ( ) ; androidId = "" + android . provider . Settings . Secure . getString ( getContentResolver ( ) , android . provider . Settings . Secure . ANDROID_ID ) ; UUID deviceUuid = new UUID ( androidId . hashCode ( ) , ( ( long ) tmDevice . hashCode ( ) << 32 ) | tmSerial . hashCode ( ) ) ; String deviceId = deviceUuid . toString ( ) ;

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 // 方法4 import android . content . Context ; import android . content . SharedPreferences ; import android . provider . Settings . Secure ; import android . telephony . TelephonyManager ; import java . io . UnsupportedEncodingException ; import java . util . UUID ; public class DeviceUuidFactory {      protected static final String PREFS_FILE = "device_id.xml" ;      protected static final String PREFS_DEVICE_ID = "device_id" ;      protected volatile static UUID uuid ;      public DeviceUuidFactory ( Context context ) {          if ( uuid == null ) {              synchronized ( DeviceUuidFactory . class ) {                  if ( uuid == null ) {                      final SharedPreferences prefs = context                              . getSharedPreferences ( PREFS_FILE , 0 ) ;                      final String id = prefs . getString ( PREFS_DEVICE_ID , null ) ;                      if ( id != null ) {                          // Use the ids previously computed and stored in the                          // prefs file                          uuid = UUID . fromString ( id ) ;                      } else {                          final String androidId = Secure . getString (                              context . getContentResolver ( ) , Secure . ANDROID_ID ) ;                          // Use the Android ID unless it's broken, in which case                          // fallback on deviceId,                          // unless it's not available, then fallback on a random                          // number which we store to a prefs file                          try {                              if ( ! "9774d56d682e549c" . equals ( androidId ) ) {                                  uuid = UUID . nameUUIDFromBytes ( androidId                                          . getBytes ( "utf8" ) ) ;                              } else {                                  final String deviceId = (                                      ( TelephonyManager ) context                                      . getSystemService ( Context . TELEPHONY_SERVICE ) )                                      . getDeviceId ( ) ;                                  uuid = deviceId != null ? UUID                                      . nameUUIDFromBytes ( deviceId                                              . getBytes ( "utf8" ) ) : UUID                                      . randomUUID ( ) ;                              }                          } catch ( UnsupportedEncodingException e ) {                              throw new RuntimeException ( e ) ;                          }                          // Write the value out to the prefs file                          prefs . edit ( )                                  . putString ( PREFS_DEVICE_ID , uuid . toString ( ) )                                  . commit ( ) ;                      }                  }              }          }      }      /**      * Returns a unique UUID for the current android device. As with all UUIDs,      * this unique ID is "very highly likely" to be unique across all Android      * devices. Much more so than ANDROID_ID is.      *      * The UUID is generated by using ANDROID_ID as the base key if appropriate,      * falling back on TelephonyManager.getDeviceID() if ANDROID_ID is known to      * be incorrect, and finally falling back on a random UUID that's persisted      * to SharedPreferences if getDeviceID() does not return a usable value.      *      * In some rare circumstances, this ID may change. In particular, if the      * device is factory reset a new device ID may be generated. In addition, if      * a user upgrades their phone from certain buggy implementations of Android      * 2.2 to a newer, non-buggy version of Android, the device ID may change.      * Or, if a user uninstalls your app on a device that has neither a proper      * Android ID nor a Device ID, this ID may change on reinstallation.      *      * Note that if the code falls back on using TelephonyManager.getDeviceId(),      * the resulting ID will NOT change after a factory reset. Something to be      * aware of.      *      * Works around a bug in Android 2.2 for many devices when using ANDROID_ID      * directly.      *      * @see http://code.google.com/p/android/issues/detail?id=10603      *      * @return a UUID that may be used to uniquely identify your device for most      *         purposes.      */      public UUID getDeviceUuid ( ) {          return uuid ;      } }

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // 方法5 // Here is the code that Reto Meier used in the google I/O presentation this year to get a unique id for the user: private static String uniqueID = null ; private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID" ; public synchronized static String id ( Context context ) {      if ( uniqueID == null ) {          SharedPreferences sharedPrefs = context . getSharedPreferences (                  PREF_UNIQUE_ID , Context . MODE_PRIVATE ) ;          uniqueID = sharedPrefs . getString ( PREF_UNIQUE_ID , null ) ;          if ( uniqueID == null ) {              uniqueID = UUID . randomUUID ( ) . toString ( ) ;              Editor editor = sharedPrefs . edit ( ) ;              editor . putString ( PREF_UNIQUE_ID , uniqueID ) ;              editor . commit ( ) ;          }      }      return uniqueID ; }

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 方法6 String m_szDevIDShort = "35"    //we make this look like a valid IMEI      + Build . BOARD . length ( ) % 10      + Build . BRAND . length ( ) % 10      + Build . CPU_ABI . length ( ) % 10      + Build . DEVICE . length ( ) % 10      + Build . DISPLAY . length ( ) % 10      + Build . HOST . length ( ) % 10      + Build . ID . length ( ) % 10      + Build . MANUFACTURER . length ( ) % 10      + Build . MODEL . length ( ) % 10      + Build . PRODUCT . length ( ) % 10      + Build . TAGS . length ( ) % 10      + Build . TYPE . length ( ) % 10      + Build . USER . length ( ) % 10 ;    //13 digits


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部