获取androidid,android

android获取设备唯一ID(优化方案)

最近,因公司产品及客户需要,领导让我研究免存储设备ID,以及给出一个设备ID最佳的方案(可与存储相结合)。在研究过浏览器的fingerprient2js后,颇有心得,并且看网上似乎木有完美的解决方案,于是写了这篇文章,仅供需要的开发者参考。(该算法暂未进行验证,这里先给出一个jar包,后期我会在SDK中加入调查接口,分两个jar包(测试版和正式版),希望开发者能支持测试版,稳定后使用正式版。)

网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了钟山免费建站欢迎大家使用!

在产品中,首先肯定要尽量避免权限,其次考虑卸载APP后ID不一致的问题,再就是尽量结合存储,降低卸载或重装app时,设备ID改变的概率。最后,设计出合理方案,对造成不利的因素进行列举。

A.android_id:

什么是android_id呢?当设备在第一次启动时,系统会随机产生一个64位的数字,然后以16进制的形式保存在设备上,且API提供了获取这一参数的方法:

这就是android_id,当设备重新初始化或者刷机的时候,会被重置。

除此以外,android_id还有其他的bug,比如:

1.不同的设备可能会产生相同的android_id。

2.有的厂商设备无法获取android_id,会返回null。

3.对于CDMA的设备,ANDROID_ID和TelephonyManager.getDeviceId() 的值相同。

4.不同的android系统版本稳定性不同。

B.硬件序列号(SERIAL)

API给的解释是:

A hardware serial number, if available.(一个硬件的序列码,如果有效的话)

so,虽然我没有用几百台手机测试,也能知道这个值有时候是无效的,说的这么隐晦。

C.指纹

fingerprint:设备的唯一标识。由设备的多个信息拼接合成。

也是在JavaScript才接触到这个单词”fingerprint“,这个词也很生动,意思是能大概的标识一个设备,像指纹一样,但不排除重复的可能性。

理论上讲用这个属性是可以标识一个设备的,但是其实并不是,两台一摸一样的新手机,这个值相同的可能性是很多的。为了更加进一步的精确,后面还会介绍几个属性,并把几个属性结合在一起,生成一个接近100%的UUID。

D.android系统提供了获取android系统版本号,生产厂商,固件版本推出时间的API.

E.android系统提供了当前android设备是12或24小时制显示时间的API,

F.android系统提供了当前android设备的修订版本列表,显示屏,主板等等参数。

G.可以允许用户根据需求用自定义字符串去为FP做贡献,比如IP地址等

方案:

在不需要用户权限的前提下,网上最完美的方案是将android_id和硬件序列号,如果其中任意一种失效就使用另外一种。受FingerPrint2js的启发,我看了Android获取系统硬件相关的API,将所有不经常变化且能代表一定用户群体的属性都取出来进行MD5运算,包含但不限于依据中所述的信息。准确性还需进一步验证,但理论上要比FingerPrint2js准确性高,也在网上给出的比较好的方案基础上进一步缩小了FP可能重复的概率。

1.第一次进入APP时,获取系统相关配置信息生成FP,存入SP。

2.每次访问,先从SP取,没有再通过相关配置信息生成FP,存入SP。

3.封装成jar,只给用户暴露出获取ID的接口、传递自定义信息构建FP的接口以及第一次安装时间戳的接口(或设置标签调用的接口)

单纯对于FP而言,有两个主要问题需要解决,一是FP重复的问题,相同配置的新设备重复可能性极大,增多给FP贡献的因素的数量,可以有效降低重复率。二是FP改变的问题,贡献FP的生成因素的其中一个如果改变,FP就会改变。所以如果FP的贡献因素数量过多,导致FP改变的概率也就变大,所以说客户要在两者之间做一个很好的平衡。

对比:

为android FP做贡献的各配置参数:(示例以6.0的华为荣耀8为例)

1.Android_ID:Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID) //低版本稳定,高版本不稳定 示例:295a4fbf716094ee

2.Build.SERIAL 设备序列号(有的设备无法获取) 示例:WTK7N16923005607

3.Build.FINGERPRINT 设备指纹(同样的新设备该值应该是一样的) 示例:honor/FRD-AL00/HWFRD:6.0/HUAWEIFRD-AL00/C00B171:user/release-keys

4.Build.TIME 固件推出日期 示例:1477442228000

5.Build.VERSION.INCREMENTAL 源码控制版本号 示例: C00B171

6.Build.getRadioVersion() 获取无线电固件版本 示例:21.210.03.00.031,21.210.03.00.031

7.Build.HARDWARE 硬件名称 示例:hi3650

8.Build.VERSION.SECURITY_PATCH 用户可见安全补丁level(这里我得到的是日期,可能是补丁修复的时间)示例:2016-10-01

9.当前设备是12/24时制:Settings.System.getString(context.getContentResolver(), Settings.System.TIME_12_24) 示例:null(有的手机可以获取)

10.Build.VERSION.SDK_INT SDK版本号 (一般讲是与系统版本号一一对应的) 示例:23

11.Build.SUPPORTED_32_BIT_ABIS 支持32位ABIs的列表(数值)示例:[armeabi-v7a,armeabi]

12.Build.SUPPORTED_64_BIT_ABIS 支持64位ABIs的列表(数值)示例:[arm64-v8a]

13.Build.BOOTLOADER 系统启动程序版本号 示例:unknown

14.Build.VERSION.RELEASE 用户可见版本 示例: 6.0

16.Build.BOARD 主板 示例:FRD-AL00

17.Build.BRAND 系统定制商 示例:honor

21.Build.HOST 示例:huawei-RH2288H-V2-12L

23.Build.MANUFACTURER 产品/硬件的制造商 示例:HUAWEI

25.Build.PRODUCT 产品的名称 示例:FRD-AL00

26.Build.TAGS 描述Build的标签(Comma-separated tags describing the build, like "unsigned,debug".) 示例:release-keys

28.Build.USER 描述Build的USER 示例:jslave

31.Build.VERSION.BASE_OS 基带版本 The base OS build the product is based on. 示例:空值

32.自定义字符串或自定义数组

请不要限制黑阈获取Android id

<strong>黑阈权限说明</strong>

1.INTERNET 拥有完全的网络访问权限。黑阈需要本地网络权限访问“黑阈服务”。

2.ACCESS_NETWORK_STATE 查看网络连接,检查网络状态,必要时提供“更新网络检测”去除网络叹号。

3.RECEIVE_BOOT_COMPLETED 开机启动,开机以后提示“黑阈没有启动”,有 Root 时直接启动。

4. com.android.vending.BILLING Google Play 结算服务提供 Google Play 支付。

5.FOREGROUND_SERVICE 运行前台服务Android O 起,开机自启需要使用“前台服务”;Android P 起,需要申请该权限。

6.com.android.launcher.permission.INSTALL_SHORTCUT创建桌面快捷方式,用于临时启用,GCM 应用等。

Android能够获取到唯一的设备ID吗

能,但是需要说明一下:

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 ADDRESS

我们也可以通过手机的Wifi或者蓝牙设备获取MAC ADDRESS作为DEVICE ID,但是并不建议这么做,因为并不是所有的设备都有Wifi,并且,如果Wifi没有打开,那硬件设备无法返回MAC ADDRESS.

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. Installtion ID : UUID

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

这种方式是通过在程序安装后第一次运行后生成一个ID实现的,但该方式跟设备唯一标识不一样,它会因为不同的应用程序而产生不同的ID,而不是设备唯一ID。因此经常用来标识在某个应用中的唯一ID(即Installtion ID),或者跟踪应用的安装数量。很幸运的,Google Developer Blog提供了这样的一个框架:

如何查看自己安卓手机的Android Device ID

1、打开拨号界面。

2、点击电话,启动拨号界面,然后输入“*#*#8255#*#*”即可进入GTalkServiceMonitor界面了。

扩展资料:

AndroidID用于唯一识别一部设备的一次刷机行为,虽然不能完全确定该设备的唯一性(真的唯一性是用IMEI号的),但是可以很大程度上过滤重复设备。

这是移动互联网广告行业,尤其是CPI广告的基础。设备ID非常重要。CPI广告是根据实际安装数量计费的,广告商可以使用androidid来排除重复安装。传递一个AndroidID直接影响到某些广告是否会被放置在某些位置。

在RTB行业中,有很多提供数据的第三方公司,他们根据AndroidID买卖数据,将各种数据对应给用户。

怎么获取android设备id

(1)DEVICE_ID

Android系统为开发者提供的用于标识手机设备的串号

TelephoneManager tm=TelephoneManager.getSystemService(Context.TELEPHONE_SERVICE);

tm.getDeviceId();

缺陷:

(1)非手机设备

(2)权限问题

(2)ANDROID_ID

在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID

String ANDROID_ID=Setting.System.getString(getContentResolver(),Setting.System.ANDROID_ID);

缺陷:

(1)厂商Bug:不同的设备可能会产生相同的ANDROID_ID

(2)厂商Bug:有些设备返回的值为null

(3)Serial Number

Android系统2.3版本以上可以通过下面的方法得到Serial Number,且非手机设备也可以通过该接口获取。

String serial=Andorid.os.Build.SERIAL;

如何获取android设备id

Android设备不同类型的识别设备ID。

· 唯一编号(IMEI,MEID,ESN,IMSI)

· MAC地址

· 序列号

· ANDROID_ID

唯一编号(IMEI,MEID,ESN,IMSI)

说明在以前,当Android设备均作为电话使用时,寻找唯一标识号比较简单:()可用于找到(取决于网络技术)手机硬件唯一的IMEI,MEID,ESN和IMSI编号。

TelephonyManager.getDeviceId

IMEI,MEID,ESN,IMSI的定义如下:

•IMEI(国际移动设备识别码)唯一编号,用于识别 GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDMA手机(国际移动用户识别码)与所有GSM和UMTS网络手机用户相关联的唯一识别编号如需要检索设备的ID,在项目中要使用以下代码:

•MEID

•ESN

•IMSI

import android.telephony.TelephonyManager;

import android.content.Context;

String imeistring = null;

String imsistring = null;

{

TelephonyManager telephonyManager;

telephonyManager =

( TelephonyManager )getSystemService( Context.TELEPHONY_SERVICE );

/*

* getDeviceId() function Returns the unique device ID.

* for example,the IMEI for GSM and the MEID or ESN for CDMA phones.

*/

imeistring = telephonyManager.getDeviceId();

/*

* getSubscriberId() function Returns the unique subscriber ID,

* for example, the IMSI for a GSM phone.

*/

imsistring = telephonyManager.getSubscriberId();

}


网页标题:获取androidid,android
标题来源:http://scyanting.com/article/dsohisj.html