如何唯一的标识一台Android设备?

UUID : (Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得)。

IMEI : (International Mobile Equipment Identity) 是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每台手机一一对应,而且该码是全世界唯一的。

MEID :( Mobile Equipment IDentifier )是全球唯一的56bit CDMA制式移动终端标识号。标识号会被烧入终端里,并且不能被修改。可用来对CDMA制式移动式设备进行身份识别和跟踪。

两者的区别在于:IMEI是手机的身份证,MEID是CDMA制式(电信运营的)的专用身份证;IMEI是15位,MEID是14位。

DEVICE_ID

根据不同的手机设备返回IMEI,MEID或者ESN码,可以根据以下代码获得:

Device_Id

非手机设备:最开始搭载Android系统都手机设备,而现在也出现了非手机设备:如平板电脑、电视、音乐播放器等。这些设备没有通话的硬件功能,系统中也就没有TELEPHONY_SERVICE,自然也就无法通过上面的方法获得DEVICE_ID。

权限问题:获取DEVICE_ID需要READ_PHONE_STATE权限,在Android 6.0上使用运行时动态授予权限的机制,一旦用户不给予授权,将获取不到DEVICE_ID。

厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾(这是开发者博客的原话,没有实践过)。

MAC ADDRESS

MAC_Address

可以使用手机WiFi或蓝牙的MAC地址作为设备标识,但是并不推荐这么做,原因有以下两点:

硬件限制:并不是所有的设备都有WiFi和蓝牙硬件,硬件不存在自然也就得不到这一信息。

获取的限制:如果WiFi没有打开过,是无法获取其Mac地址的;而蓝牙是只有在打开的时候才能获取到其Mac地址。

Serial Number

硬件序列,在Android 2.2 以上可以通过 android.os.Build.SERIAL 获得序列号。在一些没有电话功能的设备会提供,某些手机上也可能提供(所以就是经常会返回Unknown)

ANDROID_ID

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

Android_Id

ANDROID_ID似乎是获取Device ID的一个好选择,但它也有缺陷:在主流厂商生产的设备上,有一个很经常的bug,就是每个设备都会产生相同的ANDROID_ID:9774d56d682e549c 。同时刷机,或者重置ANDROID_ID的值都会变化。

接下来就来看看实际的标识方法:

第一种:Installtion ID

在程序安装后第一次运行时生成一个ID,该方式和设备唯一标识不一样,不同的应用程序会产生不同的ID,同一个程序重新安装也会不同。所以这不是设备的唯一ID,但是可以保证每个用户的ID是不同的。 可以说是用来标识每一份应用程序的唯一ID(即Installtion ID),可以用来跟踪应用的安装数量等(其实就是UUID)。

Installtion Id 获取方法

第二种:UniquePsuedoID

通过读取设备的ROM版本号、厂商名、CPU型号和其他硬件信息来组合出一串15位的号码和设备硬件序列号作为种子生成UUID。一串15位的号码(批量生产的设备每项信息基本相同,所以这一段相同的可能性特别高);硬件序列,在一些没有电话功能的设备会提供,某些手机上也可能提供(Devices without telephony are required to report a unique device ID here; some phones may do so also.),所以就是经常会返回Unknown。

UniquePsuedoID  获取方法

第三种:Universal ID

首先通过读取Android_id,作为UUID的种子。若得到Android_Id等于9774d56d682e549c或者 发生错误则random一个UUID作为备用方案,最后把得到的UUID同时存入内部存储和外部存储。下次使用UUID的时候优先从外部存储读取,再从背部存储读取,最后在重新生成,尽可能的保证其不变性。

Universal_id获取方法

参考文档:http://android-developers.blogspot.jp/2011/03/identifying-app-installations.html

来源: http://www.jianshu.com/p/178786f833b6

来自为知笔记(Wiz)

时间: 2024-08-08 13:58:06

如何唯一的标识一台Android设备?的相关文章

关于如何惟一的标识一台Android设备的总结性讨论

想必大家在开发Android项目的时候,多多少少会遇到“如何惟一地标识一台Android设备”等类似的问题.不只是以前,即使是现在乃至可以预见的将来,这个问题都将一直存在. 如果大家使用搜索工具搜索的话,大家也能够找到很多的解决方案,但每种方式都多多少少有些缺陷. 我在这里呢,将向大家解释一下诸多常见方案的不足之处,以及推荐一种相对而言比较靠谱的方法. 首先先要说明一下Android设备的情况.我们大家都知道,在起初的时候,Android设备仅仅意味着是“手机”.如果情况一直是这样就好了.可是事

Android设备上i-jetty环境的搭建-手机上的web服务器

本文主要跟大家分享如何将一台Android设备打造成一个web服务器使用. 编译i-jetty 1.将源码download下来,http://code.google.com/p/i-jetty/downloads/list 2.解压文件,进入pom.xml所在目录,执行命令:mvncleaninstall,参照(http://code.google.com/p/i-jetty/wiki/BuildInstructions) 执行过程中,出现了异常导致失败,是生成classes.dex时内存溢出的

获取Android设备唯一标识码

概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一性并不理想.而通过其他硬件信息标识也因为系统版本.手机硬件等限制存在不同程度的问题. 下面收集了一些“有能力”或“有一定能力”作为设备标识的串码. DEVICE_ID 这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且

Android设备唯一标识ID的获取

方法一: 返回的是作为唯一64位十六进制字符串的Android设备ID. import android.provider.Settings.Secure; private String android_id = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); 方法二: UUID是一个128位的全局唯一不可变的标识符(UUID). import java.util.UUID; private stati

一起学android之如何获取Android设备的唯一识别码笔记(21)

因为需要在项目中需要获得一个稳定.可靠的设备唯一识别码,因此搜了一些网上的资料.今天我们将介绍几种方式. 1. DEVICE_ID 假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID.在以前,我们的Android设备是手机,这个 DEVICE_ID可以同通过TelephonyManager.getDeviceId()获取,它根据不同的手机设备返回IMEI,MEID或者ESN 码,但它在使用的过程中会遇到很多问题: 非手机设备: 如果只带有Wifi的设备或者音乐播放器没有通话的硬

Android设备标识-没有完美的解决方案-只有取舍

本文链接    http://blog.csdn.net/xiaodongrush/article/details/28864845 1.  几种常用的设备标识码 IMEI,Sim卡序列号,Wifi模块Mac地址,Android_ID TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); String imei = telephonyMana

不需要任何权限获得Android设备的唯一ID

这个问题来自于Is there a unique Android device ID? 我对这个问题的答案做了整理,包括将另一篇文章加入进来作为补充,可以完美解决此问题. 作者提出的问题: Android设备有没有唯一的id?如果有的话,我怎么通过java代码获得这个id? 答案: 我读了stack OverStack上每一个答案,谷歌的开发者博客和Android文档,我认为'Pseudo ID' 是最好的选择. 首先先来看看我们为什么不选用其他的方法: User Email 用户可以更改他们的

Android设备信息、感应器检测

近日产品已经上线,开始有时间来做自己的事情,于是就开始学习和巩固一些以前用过的或者学过的技术.昨天写了一个检测Android设备的序列号和IMEI以及感应器等等的一个Demo来跟大家分享一下. 在开发中经常要对设备进行识别和唯一标识.我们用到了安卓设备的序列号和设备的MAC号. 一.首先是获取设备的序列号,在开发的时候我们可以这样来获得. String serialName = android.os.Build.SERIAL; 也可以用下面的一个方法来获取设备的序列号 public static

Android - 设备的DeviceId

Android设备的DeviceId是设备的唯一标识, 作为设备激活的重要依据. 有些设备无法获取DeviceId, 如红米note. 为了保证标识唯一, 使用UUID替代. 代码 // deviceId可能为空, 如红米note String deviceId = telephonyManager.getDeviceId(); if (deviceId.equals("")) { String uuid = PreferenceUtils.getFrom(PedometerApp.g