详解关于AndroidQ获取不到imsi解决方案
作者:浅淡_时光 发布时间:2023-02-21 14:23:50
标签:AndroidQ,imsi
Android Q 禁止获取 IMEI 和设备序列号;
官方的解决方案是这样:https://developer.android.com/training/articles/user-data-ids
结合官方实现方案和实际需求自己整理的实现方法如下:
方案一:
/**
* 获取设备唯一标识符
*
* @return 唯一标识符
*/
public static String getDeviceId() {
// 通过 SharedPreferences 获取 GUID
String guid = SPUtils.getInstance().getString(AppConfig.SP_GUID);
if (!TextUtils.isEmpty(guid)) {
return guid;
}
// 获取 ANDROID_ID
String android_id = Settings.System.getString(
App.getApp().getContentResolver(), Settings.Secure.ANDROID_ID);
if (!TextUtils.isEmpty(android_id)) {
// 通过 ANDROID_ID 生成 guid(唯一标识符)
guid = EncryptUtils.encryptMD5ToString(android_id);
} else {
// 通过 UUID 生成 guid(唯一标识符)
guid = EncryptUtils.encryptMD5ToString(UUID.randomUUID().toString());
}
// 保存 guid 到 SharedPreferences
SPUtils.getInstance().put(AppConfig.SP_GUID, guid);
return guid;
}
上面 SPUtils 是自己封装的 SharedPreferences 的一个工具类。
方案二:
/**
* 获取设备唯一标识符
*
* @return 唯一标识符
*/
@SuppressLint("HardwareIds")
public static String getDeviceId() {
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 位
String serial = "serial";// 默认serial可随便定义
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (ActivityCompat.checkSelfPermission(App.getApp(),
Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
// 由于 Android Q 唯一标识符权限的更改会导致
// android.os.Build.getSerial() 返回 unknown,
// 但是 m_szDevIDShort 是由硬件信息拼出来的,所以仍然保证了UUID 的唯一性和持久性。
serial = android.os.Build.getSerial();// Android Q 中返回 unknown
}
} else {
serial = Build.SERIAL;
}
} catch (Exception ignored) {
}
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
由于m_szDevIDShort是由硬件信息拼出来的,所以保证了UUID的唯一性和持久性。
来源:https://blog.csdn.net/GuangkuoDing/article/details/89087547


猜你喜欢
- 本文实例讲述了C#取得随机颜色的方法。分享给大家供大家参考。具体实现方法如下:public string GetRandomColor(){
- 微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧。微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难。下面小编给大
- Java语言中反射 * 接口的解释与演示Java在JDK1.3的时候引入了 * 机制、可以运用在框架编程与平台编程时候捕获事件、审核数据
- idea中的Maven导包失败问题解决总结1.先确定idea和Maven 的配置文件settings 没有问题找到我们本地的maven仓库,
- 生成前:public static void main(String[] args) { new HashMap<Stri
- 本文实例讲述了C#设置软件开机自动运行的方法。分享给大家供大家参考,具体如下:#region/// <summary>/// 开
- 在有些需求中会遇到,当鼠标滑过某个UI物体上方时,为了提醒用户该物体是可以交互时,我们需要添加一个动效和提示音。这样可以提高产品的体验感。解
- Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring Boot为Elasticsearch及Spring Da
- 本文实例讲述了C#多线程学习之使用线程池进行多线程的自动管理。分享给大家供大家参考。具体如下:在多线程的程序中,经常会出现两种情况:一种情况
- 今天没事跟群里面侃大山,有个哥们说道Android Wheel这个控件,以为是Andriod内置的控件,google一把,发现是个githu
- 先看看效果:用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦、高复用、高灵活。动态列表界面Mo
- 本文为大家分享了Android实现水波纹效果展示的具体代码,供大家参考,具体内容如下一、效果二、实现原理自定义view,使用Path和贝塞尔
- 如下所示:public class 字符串常用操作 { public static void main(String[] arg
- 一、前言代码死循环这个话题,个人觉得还是挺有趣的。因为只要是开发人员,必定会踩过这个坑。如果真的没踩过,只能说明你代码写少了,或者是真正的大
- JenkinsJenkins是一个开源的、可扩展的持续集成、交付、部署的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台
- DrawerLayout顾名思义就是一个管理布局的。使用方式可以与其它的布局类类似。DrawerLayout带有滑动的功能。只要按照draw
- 一、介绍本教程将介绍如何使用 mybatis-plus 工具自动给我们生成 Controller、Service、Entity、Mapper
- 顺序结构我们之前写的大多代码都是顺序结构的,即按照代码的顺序一行一行的执行代码1 System.out.println("you&
- 前言前面几篇我们学习的都是单表查询,就是对一张表中的数据进行查询。而实际项目中,基本都会有多张表联合查询的情况,今天我们就来了解下JPA的联
- # 前言之前在学习C语言的时候,做过一个三子棋的小游戏,最近开始学习Java,就想着能不能用Java再把之前的练习重新实现一边,既然有这个想