Android设备唯一标识(终极方案!)
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设备唯一标识(终极方案!)相关推荐
- android 16进制 全透明_你有几种实现方案Android 设备唯一标识?
前言 项目开发中,多少会遇到这种需求:获得设备唯一标识DeviceId,用于: 1.标识一个唯一的设备,做数据精准下发或者数据统计分析: 2.账号与设备绑定: 3..... 分析 这类文章,网上有许多 ...
- 获取android设备唯一编号_如何获取Android设备唯一标识码教程
ID的全称是(Virtual identity electronic identification),中文名为通用账户,是俗称的网络身份证.它是一种互联网身份认证协议,其具有唯一性和信息不可否认性.I ...
- 获取Android设备唯一标识
很多情况下,需要将APP和设备进行绑定,以保证用户不会无限制的注册或发送请求.然而,Android设备并没有绝对的唯一标识. Android提供了多种方法来获取所谓的唯一标识.常用的有六种. (1)A ...
- 获取Android设备唯一标识码
概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...
- Android设备唯一标识(AndroidID,OAID等 )
一.ID 体系:你只是一串代码 想要了解 OAID,我们首先需要明白 ID 体系:想要追踪一个用户就必须先找到用户,在这个过程中,标识符(ID)就像我们的另一张身份证,它们就代表了数字化之后的你和我. ...
- 获取Android设备唯一标识(唯一序列号)
有很多场景和需求你需要用到手机设备的唯一标识符. 在Android中,有以下几种方法获取这样的ID. 1. The IMEI: 仅仅只对Android手机有效: 1 2 TelephonyManage ...
- [Android][获取Android设备唯一标识]
1.落笔缘由 最近需要获取能够标志Android设备的唯一标识,但是由于Android系统版本不同或者root等诸多原因,造成有些设备标识为NULL或者标识相同的问题,在网上搜索了相关资料,总结一下各 ...
- 【Android】Android设备唯一标识简介
一.概念 IMEI IMEI(International Mobile Equipment Identity) 是国际移动设备身份码的缩写,国际移动装备辨识码,是由 15 位数字组成的 "电 ...
- android 设备唯一标识 Android_ID
ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe(刷机,恢复出厂设置)后该数重置. String secureId = Settings.Secure.getSt ...
最新文章
- Scrapy基础(一) ------学习Scrapy之前所要了解的
- 推荐算法炼丹笔记:推荐系统采样评估指标及线上线下一致性问题
- 将txt文件的编码格式进行修改
- Understanding Clouds from Satellite Images的kernel调研+肉眼识别每种云朵示例
- 企业有了程序员为什么还要用 低代码/无代码
- 前端学习(1946)vue之电商管理系统电商系统之初步使用vue-table-with-tree
- 织梦DEDE网站后台如何上传附件
- 笨方法“学习python笔记之print换行
- Ubuntu 16.04 安装 VMware-Workstation-12
- WebAPI——浏览器跨域解决方案
- 基于字典的超分辨率实现的各种方法
- python c++ 批量命名文件夹内的图像
- (附源码)计算机毕业设计ssm大学生网络安全题库系统
- 键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小
- 【IT】计算机体系结构
- 单目相机提高标定精度的经验
- 运筹学实验6 指派问题的求解
- MT6582+Android4.2的编译
- grbl控制3轴机械臂 原理 实现 (三) 之如何通过步进电机控制机械臂、插补算法
- 【Matlab】使用C语言编写简单S-Function
热门文章
- UG\NX二次开发 获取部件中的所有对象 UF_OBJ_cycle_all
- python学习笔记[3]-邮件的发送
- 做跨境电商一年买了房:未来五年的风口行业 ,90%的人都不知道 !
- 好东西~~大家随便瞧下:男女五行配婚
- 街景语义分割数据集总结
- scanf函数返回值
- 如何在右键菜单添加将文档“转换为PDF”选项
- MyBatis-Plus3.5.2 学习指南
- 最新Smarty基础商品教程 Smarty入门教程 Smarty框架教程 共10课
- 保存图像数据为BMP格式的图片