文章目录

  • 一. 因
  • 二. 果
  • 三. 解决办法
    • 1. 接入设备厂商提供的ID
    • 2. 用硬件信息拼出来一个ID

一. 因

Android Q也就是 Andriod 10, 对应的api为29
为了更好保护用户隐私,谷歌对安卓Q系统中所有获取设备识别码的接口都增加了新的权限控制:READ_PRIVILEGED_PHONE_STATE,该权限需要系统签名的应用才能申请。同时,系统默认WiFi Mac地址随机化,当设备连上不同的WiFi网络时随机生成Mac地址

二. 果

通过READ_PHONE_STATE权限获取Device ID的应用以及将设备WiFi Mac地址作为设备唯一标志符的应用将受影响
对于TargetSdkVersion<Q且没有申请READ_PHONE_STATE权限的应用和TargetSdkVersion>=Q的全部应用,获取Device ID会抛异常SecurityException
对于 TargetSdkVersion<Q且申请了READ_PHONE_STATE权限的应用,通过getDeviceId接口读取的值为Null
当设备连接到不同的 Wi-Fi网络时,系统会随机生成不同的 MAC地址,将无法作为用户唯一标志

三. 解决办法

1. 接入设备厂商提供的ID

此方法比较麻烦
以下是vivo开放平台的通知,可以参见官方SDK文档

类似的,设备厂商华为为开发者提供ODID接口来帮助开发者适配该变更

2. 用硬件信息拼出来一个ID

此比较方便,唯一性不能百分百确保,亲测可用

public static String getUUID()
{String serial = null;String m_szDevIDShort = "35" +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 = "serial"; // 随便一个初始化}//使用硬件信息拼凑出来的15位号码return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

测试

Android Q设备唯一标识符(Device ID)获取相关推荐

  1. Android手机设备唯一标识符

    在Android App开发过程中有时需要确定手机设备的唯一性.但是Android 手机设备的唯一标识的获取并不能保持每次都能获取成功,因而无法保持手机的唯一性.Android手机获取唯一标识一直没有 ...

  2. 关于android设备唯一区分device id的取得

    2019独角兽企业重金招聘Python工程师标准>>> 有些apk为了区分唯一设备,需要用到一个device id. 1. 取得设备的MAC address    如果用户没有通过w ...

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

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

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

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

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

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

  6. android device id 获取主要用于google 服务

    android device id 获取主要用于google 服务 这个功能主要是通过com.google.android.gsf.gservices 这个拿到id 以后,通过TextView 显示出 ...

  7. matlab主机ID与许可证不匹配,iDRAC7错误 - LIC008:许可证绑定ID与设备唯一标识符不匹配...

    本文讨论如何解决在第 12 代 PowerEdge 服务器上尝试导入 iDRAC7 永久许可证时出现的问题.其中包括 FM120x4.M420.M520.M520 (PE VRTX).M620.M62 ...

  8. iOS设备唯一标识符探讨

    iOS设备唯一标识符探讨 一.现有方案 1.UDID(Unique Device Identifier) 获取方法:[[UIDevice currentDevice] uniqueIdentfier] ...

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

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

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

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

最新文章

  1. orcale 日期转字符串 去掉0_C# 基础知识系列- 13 常见类库介绍(二)日期时间类...
  2. MIT Molecular Biology 笔记5 转录机制
  3. Zynq的AMP开发注意事项之sdk_repo
  4. mysql安装8.013_Mysql 8.0.13 安装
  5. [蓝桥杯2019初赛]不同子串-substr,模拟
  6. (JAVA)格式化输出日期
  7. airpodspro窃听模式_AirPods Pro实时收听怎么关闭? AirPods Pro实时收听的使用方法
  8. URLDecoder: Illegal hex characters in escape (%) pattern ...
  9. python django图书管理系统_Python框架:Django写图书管理系统(LMS)
  10. UVA10878 Decode the tape【编码】
  11. python 简明教程
  12. 六、DMSP/OLS夜间灯光数据之GDP空间化的反演
  13. Java生成Word的报告模板
  14. window10官方工具在线升级失败,终极解决方案
  15. 【车辆分类】基于matlab的视频中车辆跟踪监测分类算法仿真,包括背景差分与帧间差分以及形态学处理
  16. WEB前端是干什么的?
  17. 用计算机怎么算sin1.75,计算器sin30怎么按
  18. 这应该是把春秋招讲的最清楚的文章了,不接受反驳
  19. 那些年的成长,爱情的总结
  20. 全局快门和卷帘快门(Global shutter and Rolling shutter)

热门文章

  1. 2021年全球及中国酒店行业发展现状及竞争格局分析,全球酒店行业景气度大幅回暖「图」
  2. 未充分说明劳务采购价格公允性、供应商合作合理性,电旗股份IPO被否.
  3. Linux服务器wget:unable to resolve host address解决方法
  4. Linux驱动之TTY(一):概念
  5. def序列化器---视图序列化反序列化
  6. 疑难杂症:系统雪崩到底是为什么
  7. 小型的 JavaScript 虚拟键盘
  8. windows gvim下载dejavu sans mono字体并更换
  9. fixed在ios失效解决方案
  10. 破解tumblr背景音乐