Android手机设备唯一标识符
在Android App开发过程中有时需要确定手机设备的唯一性。但是Android 手机设备的唯一标识的获取并不能保持每次都能获取成功,因而无法保持手机的唯一性。Android手机获取唯一标识一直没有统一标准,每个公司都有自己的一套规则。首先说一下几种比较常用的作为手机设备唯一标识的:
IMEI
范围:只能支持拥有通话功能的设备,对于平板不可以。
持久性:返厂,数据擦除的时候不彻底,保留了原来的标识。
权限:需要权限:Android.permission.READ_PHONE_STATE
bug: 有些厂家的实现有bug,返回一些不可用的数据Mac地址
范围:有支持无限上网的设备
权限:需要ACCESS_WIFI_STATE权限
持久性:有些设备没有WiFi,或者蓝牙,就不可以,如果WiFi没有打开,硬件也不会返回Mac地址,不建议使用Android_ID
范围:所有Android系统设备
Bug:2.2(Froyo,8)版本系统会不可信,来自主要生产厂商的主流手机,至少有一个普遍发现的bug,这些有问题的手机相同的ANDROID_ID: 9774d56d682e549c但是如果返厂的手机,或者被root的手机,可能会变Serial Number
范围:从android 2.3 (“Gingerbread”)开始可用,可以通过android.os.Build.SERIAL获取,对于没有通话功能的设备,它会返回一个唯一的device ID,
验证在手机Wifi关闭情况下获取标识的情况:
品牌 | 型号 | 系统版本 | IMEI | Mac | Android id | Serial Number |
---|---|---|---|---|---|---|
Vivo | X5Pro V | 5.0.2 | 有 | 有 | 有 | 有 |
Oppo | R7s | 4.4.4 | 有 | 有 | 有 | 有 |
华为 | ALE-UL00 | 5.0.2 | 有 | 有 | 有 | 有 |
小米 | Redmi note2 | 5.0.2 | 有 | 有 | 有 | 有 |
小米 | 4LTE | 6.0.1 | 有 | 无 | 有 | 有 |
魅族 | M2 note | 5.1 | 有 | 有 | 有 | 有 |
HTC | m8sw | 5.0.2 | 有 | 有 | 有 | 有 |
华为 | MT7-TL10 | 5.1.1 | 有 | 有 | 有 | 有 |
三星 | SM-G9200 | 6.0.1 | 有 | 无 | 有 | 有 |
- 生成方案
常见手机设备唯一表示码选择上面的一种或几种,但是部分手机的Mac码的获取会与Wifi状态有关,改动较大因此舍弃Mac码。挑选出IMEI码、Android ID、Serial Number拼接成一个字符串,然后通过MD5加密生成一个唯一标识。
IMEI码、Android ID、Serial Number的获取:
String macId = getMacAddress(this);
Log.e("yushan", "macId:::" + macId);String IMIESId = getIMIEStatus(this);
Log.e("yushan", "IMIESId:::" + IMIESId);String AndroidId = getAndroidId(this);
Log.e("yushan", "AndroidId:::" + AndroidId);String AndroidSerial = getAndroidSerial();
Log.e("yushan", "AndroidSerial:::" + AndroidSerial);public static String getMacAddress(Context context) {String macAddress = null;WifiInfo wifiInfo = getWifiInfo(context);if (wifiInfo != null) {macAddress = wifiInfo.getMacAddress();}return macAddress;
}/*** 获取WifiInfo*/
public static WifiInfo getWifiInfo(Context context) {WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo info = null;if (null != wifiManager) {info = wifiManager.getConnectionInfo();}return info;
}private static String getIMIEStatus(Context context) {String deviceId = "";if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);} else {TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);deviceId = tm.getDeviceId();}return deviceId;
}private static String getAndroidId(Context context) {String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);return androidId;
}private String getAndroidSerial() {String serialNum = Build.SERIAL;return serialNum;
}
通过MD5加密生成唯一标识:
String pseudoId = "21" + // 加盐getIMIEStatus(this) + // IMEI码getAndroidSerial() + // Serial numgetAndroidId(this); // Android IdString md5Str = makeMD5(pseudoId);
Log.e("yushan", "md5Str:::" + md5Str);// MD5加密
public static String makeMD5(String password) {try {// 生成一个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");// 计算md5函数md.update(password.getBytes());// digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值return new BigInteger(1, md.digest()).toString(16);} catch (Exception e) {e.printStackTrace();}return password;
}
关于Android 手机设备唯一标识符的生成就到这里,希望这篇博客能够为小伙伴们提供一些帮助。
Android手机设备唯一标识符相关推荐
- ios获取手机型号、系统版本、设备唯一标识符、手机运营商等
直接代码: //设备唯一标识符NSString *identifierStr = [[[UIDevice currentDevice] identifierForVendor] UUIDString] ...
- Unity实现在Android端获取Android手机的唯一ID(设备号)(亲测Android11可用)
Unity实现在Android端获取Android手机的唯一ID(设备号)(亲测Android11可用) 备注:测试版本Unity2020,理论上Unity2018以上都可用,未做测试 - 文章初衷 ...
- android获取设备唯一标识_数据埋点:用户唯一标识
用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户. 01 为什么要建设用户唯一标识 如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情. ...
- 手机设备唯一标识相关概念
手机设备唯一标识相关概念 IMEI 定义 IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写.俗称"手机串号".& ...
- 获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址
获取Android 手机设备信息:操作系统版本号.手机分辨率.运营商.当前联网方式.IMEI.MEID.MAC地址 包括双卡机型上的两个IMEI信息 /*** Created by Administr ...
- 通过Safari浏览器获取iOS设备UDID(设备唯一标识符)
通过Safari与mobileconfig获取iOS设备UDID(设备唯一标识符) 科普:U D I D (Unique Device Identifier),唯一标示符,是iOS设备的一个唯一识别码 ...
- iOS设备唯一标识符解决方案
iOS设备唯一标识符解决方案 最近在公司的项目中有记录设备唯一标识符的需求,通过唯一标识符去识别设备的注册类别从而进行角色的切换,在这个过程中查找了一些资料,在此稍作总结,留下一些痕迹,当然能给有同类 ...
- 通过Safari与mobileconfig获取iOS设备UDID(设备唯一标识符)
本文基于在线安装Profile来实现获取UDID. 先看下效果,真机打开 获取设备UDID 科普 UDID UDID (Unique Device Identifier),唯一标示符,是iOS设备的一 ...
- Android用户设备唯一标识老用户识别方案
Android用户设备唯一标识 方案 方案1:UUID + SharePreference(存取) APP首次使用时,创建UUID,并保存到SharePreference中. 以后再次使用时,直接从S ...
最新文章
- UVA10382喷水装置
- C语言高级技巧-在Makefile中引用你的头文件
- 时间怎么算用计算机,抖音珍惜时间计算器怎么用
- java 连接kafka超时_java – Kafka KStreams – 处理超时
- 最简单的java WebService服务器端搭建
- 复旦大学邱锡鹏教授《神经网络与深度学习》最新版!
- AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
- Strace诊断CPU跑高问题(java/php网站)
- 容器技术Docker K8s 52 边缘容器服务(ACK@Edge)-边缘计算和边缘容器
- 新版犀牛书该不该入手?
- c语言通讯录程序设计个人感言,C语言学习感悟(1)
- 计算机专业英语词汇缩写CIA,CIA英文词汇缩写
- 使用webpack打包nodejs 后台端环境|NodeJs 打包后台代码
- 如何解决apt-get中Unmet dependencies问题
- 世界各地 史上最全最详细无线通信频率分配表(内容含概wifi、2.4G、5G,绝对值得收藏)
- 计算机师徒结对方案,指导青年教师(师徒结对)工作计划
- BM27 按之字形顺序打印二叉树
- 冬季最新流行的室内运动减肥
- css网页布局小练习,文字案例,小米官网卡片案例
- VRTK4开发VR2:射线