转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50511283 文章出自:薛瑄的博客
你也可以查看我的其他同类文章,也会让你有一定的收货!
假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。它根据不同的手机设备返回IMEI,MEID或者ESN码,但它在使用的过程中会遇到很多问题:
1)非手机设备: 如果只带有Wifi的设备或者音乐播放器没有通话的硬件功能的话就没有这个DEVICE_ID
2)权限: 获取DEVICE_ID需要READ_PHONE_STATE权限,但如果我们只为了获取它,没有用到其他的通话功能,那这个权限有点大才小用
3)bug:在少数的一些手机设备上,该实现有漏洞,会返回垃圾,如:zeros(全是0)或者asterisks(星号)的产品
使用方法:
TelephonyManager.getDeviceId()//获取DEVICE_ID
TelephonyManager.getSimSerialNumber()
Android studio 调试窗口,有一列显示的就是Serial Number
使用方法:
return android.os.Build.SERIAL
通过手机的Wifi或者蓝牙设备获取MAC ADDRESS作为DEVICE ID,但是并不建议这么做,因为:
ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe后会被重置。ANDROID_ID似乎是获取设备唯一标识的一个好选择,但它也有缺陷:
它在Android <=2.1 or Android >=2.3的版本是可靠、稳定的,但在2.2的版本并不是100%可靠的
在主流厂商生产的设备上,有一个很经常的bug,就是每个设备都会产生相同的ANDROID_ID:9774d56d682e549c
厂商定制系统的Bug:有些设备返回的值为null。
设备差异:对于CDMA设备,ANDROID_ID和DEVICE_ID是相同的值
使用方法:
//返回一个字符串
android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
更多:http://blog.sina.com.cn/s/blog_6489d55b01012q8t.html
以上四种方式存在的一定的局限性或者bug,另外一种方式解决,就是使用UUID,该方法无需访问设备的资源,也跟设备类型无关。
这是一个自定义的值:
下面这段话引用这篇文章
在程序第一次安装运行后生成一个ID(注意:是自己生成,而非系统主动生成的!),但该方式跟设备唯一标识不一样,它会因为不同的应用程序而产生不同的ID,而不是设备唯一ID。因此经常用来标识在某个应用中的唯一ID(即Installtion ID),或者跟踪应用的安装数量。
“它会因为不同的应用程序而产生不同的ID”,这句是错误的,因为是自定义的,所以不同的应用程序,可能不一样也可能一样,甚至相同的应用程序,不同的机型都一样。UUID完全自定义。
示例:
可以使用 String.hashCode() 加密序列号
final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice, tmSerial, tmPhone, 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 uniqueId = deviceUuid.toString();
参考:http://www.cnblogs.com/xiaowenji/archive/2011/01/11/1933087.html
http://www.cnblogs.com/lqminn/p/4204855.html
关注我的公众号,轻松了解和学习更多技术