Android设备唯一标识

背景

Android系统中并没有可靠获取所有厂商设备唯一ID的方法,各个方法都有自己的使用范围和局限性,这也是目前流行的Android系统版本过多,设备也是来自不同厂商,且没有统一标准等原因造成的。

常规方案

  • DEVICE_ID
  • MAC ADDRESS
  • 设备序列号Serial Number
  • ANDROID_ID
  • 手机硬件信息

DEVICE_ID

DEVICE_ID可以同通过getSystemService(Context.TELEPHONY_SERVICE).getDeviceId()获取,它根据不同的手机设备返回IMEI,MEID或者ESN码

缺点

非手机设备无法获取
权限问题(6.0以上需要申请权限)

转发请指明出处:https://blog.csdn.net/fepengwang/article/details/116664289

MAC ADDRESS

获取方式:

WifiManager wifiManager=(WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo=wifiManager.getConnectionInfo();
String mac=wifiInfo.getMacAddress();

缺点

权限问题(6.0以上需要申请权限)

另外一种获取方式:

NetworkInterface networkInterface = NetworkInterface.getByName("wlan0");
byte[] mac = networkInterface.getHardwareAddress();

缺点

  • 如果重启手机后,Wifi没有打开过,是无法获取其Mac地址的
  • mac变更问题
  • 需要 ACCESS_WIFI_STATE 权限

设备序列号Serial Number

获取方式:

String serialNum = android.os.Build.SERIAL;
//装有SIM卡的设备获取办法:getSystemService(Context.TELEPHONY_SERVIEC).getSimSerialNumber();

缺点

  • CDMA设备,返回的是一个空值。
  • 少数的一些设备上,会返回垃圾数据。
  • 对于没有通话功能的设备,它可能会返回一个固定的值

ANDROID_ID

获取方式:

import android.provider.Settings;
String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);

缺点

  • 当设备被恢复出厂设置后该值会被重置
  • 在Android <=2.1 or Android >=2.3的版本是可靠、稳定的,但在2.2的版本并不是100%可靠的
  • 厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID
  • 厂商定制系统的Bug:有些设备返回的值为null

手机硬件信息(推荐)

android.os.Build类中,包括了这样的一些信息(如:手机制作商,系统版本等)。我们可以直接调用 而不需要添加任何的权限和方法。

即使重置系统一样唯一

android.os.Build.BOARD:获取设备基板名称
android.os.Build.BOOTLOADER:获取设备引导程序版本号
android.os.Build.BRAND:获取设备品牌
android.os.Build.CPU_ABI:获取设备指令集名称(CPU的类型)
android.os.Build.CPU_ABI2:获取第二个指令集名称
android.os.Build.DEVICE:获取设备驱动名称
android.os.Build.DISPLAY:获取设备显示的版本包(在系统设置中显示为版本号)和ID一样
android.os.Build.FINGERPRINT:设备的唯一标识。由设备的多个信息拼接合成。
android.os.Build.HARDWARE:设备硬件名称,一般和基板名称一样(BOARD)
android.os.Build.HOST:设备主机地址
android.os.Build.ID:设备版本号。
android.os.Build.MODEL :获取手机的型号 设备名称。
android.os.Build.MANUFACTURER:获取设备制造商
android:os.Build.PRODUCT:整个产品的名称
android:os.Build.RADIO:无线电固件版本号,通常是不可用的 显示unknown
android.os.Build.TAGS:设备标签。如release-keys 或测试的 test-keys
android.os.Build.TIME:时间
android.os.Build.TYPE:设备版本类型  主要为"user" 或"eng".
android.os.Build.USER:设备用户名 基本上都为android-build
android.os.Build.VERSION.RELEASE:获取系统版本字符串。如4.1.2 或2.2 或2.3等
android.os.Build.VERSION.CODENAME:设备当前的系统开发代号,一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系统源代码控制值,一个数字或者git hash值
android.os.Build.VERSION.SDK:系统的API级别 一般使用下面大的SDK_INT 来查看
android.os.Build.VERSION.SDK_INT:系统的API级别 数字表示

根据以上信息,定制自己的唯一值规则。如:

    public static String getUUID() {String serial = null;String m_szDevIDShort = "随机两位数" +Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +Build.USER.length() % 10; //13 位try {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {serial = android.os.Build.getSerial();} else {serial = Build.SERIAL;}//API>=9 使用serial号return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();} catch (Exception exception) {//serial需要一个初始化serial = "默认值"; // 随便一个初始化}//使用硬件信息拼凑出来的15位号码return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();}

以上为自己的看法,如果有更好的解决方案,欢迎留言评论互相学习。

Android设备唯一标识(终极方案!)相关推荐

  1. android 16进制 全透明_你有几种实现方案Android 设备唯一标识?

    前言 项目开发中,多少会遇到这种需求:获得设备唯一标识DeviceId,用于: 1.标识一个唯一的设备,做数据精准下发或者数据统计分析: 2.账号与设备绑定: 3..... 分析 这类文章,网上有许多 ...

  2. 获取android设备唯一编号_如何获取Android设备唯一标识码教程

    ID的全称是(Virtual identity electronic identification),中文名为通用账户,是俗称的网络身份证.它是一种互联网身份认证协议,其具有唯一性和信息不可否认性.I ...

  3. 获取Android设备唯一标识

    很多情况下,需要将APP和设备进行绑定,以保证用户不会无限制的注册或发送请求.然而,Android设备并没有绝对的唯一标识. Android提供了多种方法来获取所谓的唯一标识.常用的有六种. (1)A ...

  4. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  5. Android设备唯一标识(AndroidID,OAID等 )

    一.ID 体系:你只是一串代码 想要了解 OAID,我们首先需要明白 ID 体系:想要追踪一个用户就必须先找到用户,在这个过程中,标识符(ID)就像我们的另一张身份证,它们就代表了数字化之后的你和我. ...

  6. 获取Android设备唯一标识(唯一序列号)

    有很多场景和需求你需要用到手机设备的唯一标识符. 在Android中,有以下几种方法获取这样的ID. 1. The IMEI: 仅仅只对Android手机有效: 1 2 TelephonyManage ...

  7. [Android][获取Android设备唯一标识]

    1.落笔缘由 最近需要获取能够标志Android设备的唯一标识,但是由于Android系统版本不同或者root等诸多原因,造成有些设备标识为NULL或者标识相同的问题,在网上搜索了相关资料,总结一下各 ...

  8. 【Android】Android设备唯一标识简介

    一.概念 IMEI IMEI(International Mobile Equipment Identity) 是国际移动设备身份码的缩写,国际移动装备辨识码,是由 15 位数字组成的 "电 ...

  9. android 设备唯一标识 Android_ID

    ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe(刷机,恢复出厂设置)后该数重置. String secureId = Settings.Secure.getSt ...

最新文章

  1. Scrapy基础(一) ------学习Scrapy之前所要了解的
  2. 推荐算法炼丹笔记:推荐系统采样评估指标及线上线下一致性问题
  3. 将txt文件的编码格式进行修改
  4. Understanding Clouds from Satellite Images的kernel调研+肉眼识别每种云朵示例
  5. 企业有了程序员为什么还要用 低代码/无代码
  6. 前端学习(1946)vue之电商管理系统电商系统之初步使用vue-table-with-tree
  7. 织梦DEDE网站后台如何上传附件
  8. 笨方法“学习python笔记之print换行
  9. Ubuntu 16.04 安装 VMware-Workstation-12
  10. WebAPI——浏览器跨域解决方案
  11. 基于字典的超分辨率实现的各种方法
  12. python c++ 批量命名文件夹内的图像
  13. (附源码)计算机毕业设计ssm大学生网络安全题库系统
  14. 键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小
  15. 【IT】计算机体系结构
  16. 单目相机提高标定精度的经验
  17. 运筹学实验6 指派问题的求解
  18. MT6582+Android4.2的编译
  19. grbl控制3轴机械臂 原理 实现 (三) 之如何通过步进电机控制机械臂、插补算法
  20. 【Matlab】使用C语言编写简单S-Function

热门文章

  1. UG\NX二次开发 获取部件中的所有对象 UF_OBJ_cycle_all
  2. python学习笔记[3]-邮件的发送
  3. 做跨境电商一年买了房:未来五年的风口行业 ,90%的人都不知道 !
  4. 好东西~~大家随便瞧下:男女五行配婚
  5. 街景语义分割数据集总结
  6. scanf函数返回值
  7. 如何在右键菜单添加将文档“转换为PDF”选项
  8. MyBatis-Plus3.5.2 学习指南
  9. 最新Smarty基础商品教程 Smarty入门教程 Smarty框架教程 共10课
  10. 保存图像数据为BMP格式的图片