在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手机设备唯一标识符相关推荐

  1. ios获取手机型号、系统版本、设备唯一标识符、手机运营商等

    直接代码: //设备唯一标识符NSString *identifierStr = [[[UIDevice currentDevice] identifierForVendor] UUIDString] ...

  2. Unity实现在Android端获取Android手机的唯一ID(设备号)(亲测Android11可用)

    Unity实现在Android端获取Android手机的唯一ID(设备号)(亲测Android11可用) 备注:测试版本Unity2020,理论上Unity2018以上都可用,未做测试 - 文章初衷 ...

  3. android获取设备唯一标识_数据埋点:用户唯一标识

    用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户. 01 为什么要建设用户唯一标识 如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情. ...

  4. 手机设备唯一标识相关概念

    手机设备唯一标识相关概念 IMEI 定义 IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写.俗称"手机串号".& ...

  5. 获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址

    获取Android 手机设备信息:操作系统版本号.手机分辨率.运营商.当前联网方式.IMEI.MEID.MAC地址 包括双卡机型上的两个IMEI信息 /*** Created by Administr ...

  6. 通过Safari浏览器获取iOS设备UDID(设备唯一标识符)

    通过Safari与mobileconfig获取iOS设备UDID(设备唯一标识符) 科普:U D I D (Unique Device Identifier),唯一标示符,是iOS设备的一个唯一识别码 ...

  7. iOS设备唯一标识符解决方案

    iOS设备唯一标识符解决方案 最近在公司的项目中有记录设备唯一标识符的需求,通过唯一标识符去识别设备的注册类别从而进行角色的切换,在这个过程中查找了一些资料,在此稍作总结,留下一些痕迹,当然能给有同类 ...

  8. 通过Safari与mobileconfig获取iOS设备UDID(设备唯一标识符)

    本文基于在线安装Profile来实现获取UDID. 先看下效果,真机打开 获取设备UDID 科普 UDID UDID (Unique Device Identifier),唯一标示符,是iOS设备的一 ...

  9. Android用户设备唯一标识老用户识别方案

    Android用户设备唯一标识 方案 方案1:UUID + SharePreference(存取) APP首次使用时,创建UUID,并保存到SharePreference中. 以后再次使用时,直接从S ...

最新文章

  1. UVA10382喷水装置
  2. C语言高级技巧-在Makefile中引用你的头文件
  3. 时间怎么算用计算机,抖音珍惜时间计算器怎么用
  4. java 连接kafka超时_java – Kafka KStreams – 处理超时
  5. 最简单的java WebService服务器端搭建
  6. 复旦大学邱锡鹏教授《神经网络与深度学习》最新版!
  7. AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
  8. Strace诊断CPU跑高问题(java/php网站)
  9. 容器技术Docker K8s 52 边缘容器服务(ACK@Edge)-边缘计算和边缘容器
  10. 新版犀牛书该不该入手?
  11. c语言通讯录程序设计个人感言,C语言学习感悟(1)
  12. 计算机专业英语词汇缩写CIA,CIA英文词汇缩写
  13. 使用webpack打包nodejs 后台端环境|NodeJs 打包后台代码
  14. 如何解决apt-get中Unmet dependencies问题
  15. 世界各地 史上最全最详细无线通信频率分配表(内容含概wifi、2.4G、5G,绝对值得收藏)
  16. 计算机师徒结对方案,指导青年教师(师徒结对)工作计划
  17. BM27 按之字形顺序打印二叉树
  18. 冬季最新流行的室内运动减肥
  19. css网页布局小练习,文字案例,小米官网卡片案例
  20. VRTK4开发VR2:射线

热门文章

  1. WordPress一款简约轻快且强大的MDx主题
  2. python直接把汉字转换为拼音
  3. 【前端——Node.js】:身份认证
  4. 动态规划问题——当一脸懵逼后的心路历程
  5. 介绍一个产品的思维导图_产品经理可以用思维导图做什么?
  6. 详谈Office365和Office2019的版本与区别
  7. 宁波之行三天两夜回顾
  8. 流程图flow-chart 教程
  9. 宝二爷,一个以太坊铁杆粉为何转投EOS?
  10. BUPT OJ143 Triangle