获取Android设备的唯一识别码|设备号|序号|UUID

news/2024/11/30 1:49:52/

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50511283 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

1. DEVICE_ID

假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。它根据不同的手机设备返回IMEI,MEID或者ESN码,但它在使用的过程中会遇到很多问题:

1)非手机设备: 如果只带有Wifi的设备或者音乐播放器没有通话的硬件功能的话就没有这个DEVICE_ID

2)权限: 获取DEVICE_ID需要READ_PHONE_STATE权限,但如果我们只为了获取它,没有用到其他的通话功能,那这个权限有点大才小用

3)bug:在少数的一些手机设备上,该实现有漏洞,会返回垃圾,如:zeros(全是0)或者asterisks(星号)的产品

使用方法:

TelephonyManager.getDeviceId()//获取DEVICE_ID

2. Sim Serial Number

  • 所有的GSM设备 (测试设备都装载有SIM卡) 可以返回一个TelephonyManager.getSimSerialNumber()
  • 所有的CDMA 设备对于 getSimSerialNumber() 却返回一个空值!
    使用方法:
TelephonyManager.getSimSerialNumber()

3. Serial Number

  • 没有电话功能的设备被要求必须提供这个序列号。
  • 有电话功能的,我使用的是华为C8817E,也是有这个值的。

Android studio 调试窗口,有一列显示的就是Serial Number

使用方法:

return android.os.Build.SERIAL

4. MAC ADDRESS

通过手机的Wifi或者蓝牙设备获取MAC ADDRESS作为DEVICE ID,但是并不建议这么做,因为:

  1. 硬件限制:并不是所有的设备都有Wifi和蓝牙硬件,硬件不存在自然也就得不到这一信息。
  2. 获取的限制:如果Wifi没有打开过,是无法获取其Mac地址的;而蓝牙是只有在打开的时候才能获取到其Mac地址。

5. ANDROID_ID

ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe后会被重置。ANDROID_ID似乎是获取设备唯一标识的一个好选择,但它也有缺陷:

  1. 它在Android <=2.1 or Android >=2.3的版本是可靠、稳定的,但在2.2的版本并不是100%可靠的

  2. 在主流厂商生产的设备上,有一个很经常的bug,就是每个设备都会产生相同的ANDROID_ID:9774d56d682e549c

  3. 厂商定制系统的Bug:有些设备返回的值为null。

  4. 设备差异:对于CDMA设备,ANDROID_ID和DEVICE_ID是相同的值

使用方法:

//返回一个字符串
android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

6. Installtion ID : UUID

更多:http://blog.sina.com.cn/s/blog_6489d55b01012q8t.html

以上四种方式存在的一定的局限性或者bug,另外一种方式解决,就是使用UUID,该方法无需访问设备的资源,也跟设备类型无关。

这是一个自定义的值:

  • 自定义生成UUID ,可根据上述的几种方式,生成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

关注我的公众号,轻松了解和学习更多技术
这里写图片描述


http://www.ppmy.cn/news/382801.html

相关文章

[小知识]excel数字转中文大写公式

TEXT(INT(A1),"[DBNUM2]")&"元"&TEXT(MID(A1,LEN(INT(A1))2,1),"[DBNUM2]D角")&TEXT(MID(A1,LEN(INT(A1))3,1),"[DBNUM2]D分")&"整"

YouTube---获取iframe的时间

YouTube教程 https://developers.google.com/youtube/iframe_api_reference?csw1 后台上传YouTube视频链接&#xff0c;获取这个视屏的时长。 主要代码&#xff1a; 1.获取videoId // 获取YouTube视频的videoIdfunction matchYoutubeUrl(url) {var p /^(?:https?:\/\/)?…

python中类的输出或类的实例输出为<__main__类名 object at xxxx>这种形式的原因

今天在复现TSN时发现代码中有一段这样的语句 class VideoRecord(object):def __init__(self, row):self._data rowpropertydef path(self):return self._data[0]propertydef num_frames(self):return int(self._data[1])propertydef label(self):return int(self._data[2])cl…

IDEA默认代码样式的坑,逗号前面默认加上了空格

IDEA默认代码样式的坑&#xff0c;逗号前面默认加上了空格 个人习惯编写完代码&#xff0c;会使用CTRLALTL进行代码格式化&#xff0c;同时设置了提交的时候进行代码重排和格式化。突然有一天&#xff0c;格式化代码之后发现跟仓库的差异文件几百个&#xff0c;吓死。。。 当然…

​DMBOK知识梳理for CDGA/CDGP——第六章 数据存储与操作(附常考知识点)

第六章 数据存储与操作 第六章在CDGA|CDGP考试中的分值占比较少&#xff0c;知识点比较密集&#xff0c;主要考点包括&#xff1a;数据存储与操作的定义、目标、数据库管理员&#xff08;DBA&#xff09;的角色定位及类型、数据处理的类型ACID和BASE的区别、数据库环境、活动、…

JAVA SMART系统-系统框架设计与开发(源代码+论文)

SMART系统是一个新型智能在线考试信息管理系统,该系统主要实现了学生在线考试与评估以及教师对学生在线考试信息的管理和维护。本文按照SMART系统的非功能性需求,基于Struts、Spring、Hibernate三种开源技术,构建了一个具有良好的可扩展性、可维护性、可靠性的系统框架。整个…

获取地理位置请求免费天气接口

需求&#xff1a;根据地理位置信息去请求免费的天气接口数据&#xff0c;拿到数据后进行展示&#xff0c;这边我用到了俩个key&#xff0c;一个是高德天气的key和心知天气的key&#xff0c;为什么要这么麻烦呢&#xff0c;是因为之前写过一版不需要获取地理位置&#xff0c;直接…

linux服务器测网速,linux服务器如何测试网速?

以下测试方法仅适用于linux主机测试自己的电脑到网络服务提供商的网络连接速度。Speedtest的工作原理并不复杂&#xff0c;它在你的浏览器中加载JavaScript代码并自动检测离你最近的Speedtest服务器&#xff0c;然后向服务器发送HTTP GET and POST请求来测试上行/下行网速。 l…