最近一直在搞注册的问题,想要获得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。

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

 

更多相关文章

  1. android 笔记 ---- 使用Hessian与Java服务端通讯
  2. 调整Android手机的默认亮度
  3. Android(安卓)KitCat 4.4.2 ADB 官方所支持的所有Services格式翻
  4. Android之父安迪·鲁宾:乔布斯羡慕嫉妒恨的人
  5. 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
  6. ubuntu下adb不能检测到android手机
  7. [置顶] Android超精准计步器开发-Dylan计步
  8. carLife 车机端集成
  9. 无线ADB调试

随机推荐

  1. android蓝牙模块
  2. CheckBox android:paddingLeft 不兼容问
  3. JNI 无法确定Bitmap的签名
  4. android webview加载哔哩哔哩网页视频无
  5. Gradle Sync Failed,报错"could not find
  6. android问题解答
  7. Android Wifi相关广播 -- WIFI_STATE_CHA
  8. Android获取应用自身相关签名信息
  9. Android MediaPlayer基本知识
  10. [Android] 华为荣耀2制作fastboot线刷包[