获取 Android 设备的唯一标识码

最近一直在搞注册的问题,想要获得android的一个唯一标识,但是各种方法都有弊病,先详细分析一下:

1. DEVICE_ID

假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。在以前,我们的Android设备是手机,这个DEVICE_ID可以同通过TelephonyManager.getDeviceId()获取,它根据不同的手机设备返回IMEI,MEID或者ESN码,但它在使用的过程中会遇到很多问题:

  • 非手机设备: 如果只带有Wifi的设备或者音乐播放器没有通话的硬件功能的话就没有这个DEVICE_ID
  • 权限: 获取DEVICE_ID需要READ_PHONE_STATE权限,但如果我们只为了获取它,没有用到其他的通话功能,那这个权限有点大才小用
  • bug:在少数的一些手机设备上,该实现有漏洞,会返回垃圾,如:zeros或者asterisks的产品

2. MAC 地址

我们也可以通过手机的Wifi或者蓝牙设备获取MAC ADDRESS作为DEVICE ID,但是并不建议这么做,因为并不是所有的设备都有Wifi,并且,如果Wifi没有打开,那硬件设备无法返回MAC地址,这里所说的wifi没有打开是指开机后wifi一直没有打开,若打开过一次就能得到mac地址,附上打开wifi的代码:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
  if (!wifi.isWifiEnabled()) {
            wifi.setWifiEnabled(true);
  }

这里需要添加允许打开wifi的权限:

3. Serial Number

在Android 2.3可以通过android.os.Build.SERIAL获取,非手机设备可以通过该接口获取。

4. ANDROID_ID

ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe后该数重置

ANDROID_ID似乎是获取Device ID的一个好选择,但它也有缺陷:

  • 它在Android <=2.1 or Android >=2.3的版本是可靠、稳定的,但在2.2的版本并不是100%可靠的
  • 在主流厂商生产的设备上,有一个很经常的bug,就是每个设备都会产生相同的ANDROID_ID:9774d56d682e549c

5.手机卡的信息(IMSI)

如果你想得到手机的手机号,目前来看还有一定的难度,主要是有的卡的信息是放在服务提供商的服务器上,但是不要着急,我们能够得到手机卡的唯一标识:

TelephonyManager tm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

tm.getSubscriberId();//IMSI

现在主要问题是有些手机的mac地址会变,这个不受程序控制,每开关一个wifi,mac地址都会变一次(不过大部分的是不变的),android手机各种各样,要考虑全部的肯定是考虑不过来,所以推荐使用手机卡的IMSI。

现在我也没有找到最优的,欢迎大家交流!

 

你可能感兴趣的:(android技术)