Android Q(安卓10)获取唯一ID(最优解)
安卓Q中google彻底禁止了第三发应用获取imei,并且mac地址返回的地址也变成了02:00:00:00:00:00。
这是官方给出的解决方案:
https://developer.android.com/training/articles/user-data-ids
这是官网的截图:
方法一:
既然这两个都没法获取了,所以想到获取ANDROID_ID:
public static String getAndroidId (Context context) {String ANDROID_ID = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);return ANDROID_ID;}
但是发现不同应用的正式包在相同设备上得到的ANDROID_ID结果不同,因此显然该方案不可行。
方法二:
按照google官方意见,是在安装应用时,生成UUID,保存到本地,如果本地已经存在UUID,则不在保存,这样就可以将UUID作为唯一标识符。下面是官方推荐截图:
好的,那么就使用UUID:
String uuidStr = UUID.randomUUID().toString();
将UUID以文件的形式保存在多媒体文件目录下,这样一来各个不同的应用间都能采用同一个UUID。生成UUID。其中 saveFileName 为存放uuid数据的文件名:
/*** 在媒体文件中 生成fileName文件* 向Mediastore添加内容** @param saveFileName 保存文件的名称*/private void creatUUIDFile(String saveFileName) {ContentValues values = new ContentValues();values.put(MediaStore.Images.Media.DISPLAY_NAME, saveFileName);values.put(MediaStore.Images.Media.MIME_TYPE, "image/*");// TODO: 2019-10-11 IS_PENDING = 1表示对应的item还没准备好values.put(MediaStore.Images.Media.IS_PENDING, 1);ContentResolver resolver = this.getContentResolver();Uri collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);Uri uri = resolver.insert(collection, values);try {//访问 对于单个媒体文件,请使用 openFileDescriptor()。ParcelFileDescriptor fielDescriptor = resolver.openFileDescriptor(uri, "w", null);FileOutputStream outputStream = new FileOutputStream(fielDescriptor.getFileDescriptor());try {//讲UUID写入到文件中String uuidStr = UUID.randomUUID().toString();outputStream.write(uuidStr.getBytes());outputStream.close();Log.d(TAG, "写入 uuidStr:" + uuidStr);} catch (IOException e) {e.printStackTrace();}values.clear();values.put(MediaStore.Images.Media.IS_PENDING, 0); //设置为0resolver.update(uri, values, null, null);} catch (FileNotFoundException e) {e.printStackTrace();}}
如果需要判断是否已经存在存放uuid的文件,则用下面的方法:
/*** 检查文件是否存在** @param saveFileName 保存文件的名称* @return true 为存在 false为不存在*/private boolean checkUUIDFileByUri(String saveFileName) {Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;String[] projection = {MediaStore.Images.Media.DISPLAY_NAME,MediaStore.Images.Media._ID};//查询ContentResolver contentResolver = this.getContentResolver();// 添加筛选条件String selection = MediaStore.Images.Media.DISPLAY_NAME + "=" + "'" + saveFileName + "'";Cursor mCursor = contentResolver.query(mImageUri, projection, selection, null, null);String getSaveContent = "";if (mCursor != null) {while (mCursor.moveToNext()) {int fileIdIndex = mCursor.getColumnIndex(MediaStore.Images.Media._ID);String thumbPath = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().appendPath(String.valueOf(mCursor.getInt(fileIdIndex))).build().toString();Uri fileUri = Uri.parse(thumbPath);try {ParcelFileDescriptor fielDescriptor = contentResolver.openFileDescriptor(fileUri, "r", null);FileInputStream inputStream = new FileInputStream(fielDescriptor.getFileDescriptor());getSaveContent = inputStreamToString(inputStream);} catch (FileNotFoundException e) {e.printStackTrace();}//只有在得到的唯一标识符不为空的情况下才结束循环,否则一直循环if (!TextUtils.isEmpty(getSaveContent)) {break;}}mCursor.close();}return !getSaveContent.equals("");}
上面代码中的inputStreamToString()方法为流转字符串,代码如下:
/*** 流转为字符串** @param is 流* @return 转换完成的字符串*/public String inputStreamToString(InputStream is) {BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder sb = new StringBuilder();String line;try {while ((line = reader.readLine()) != null) {sb.append(line).append("/n");}} catch (IOException e) {e.printStackTrace();} finally {try {is.close();} catch (IOException e) {e.printStackTrace();}}return sb.toString();}
好的,先这样。
Android Q(安卓10)获取唯一ID(最优解)相关推荐
- 谷歌手机升级android10,Android Q安卓10.0新特性,首批支持升级21款手机
原标题:Android Q安卓10.0新特性,首批支持升级21款手机 2019年5月8日,一年一度的谷歌I/O开发者大会在美国加州如期召开,并发布了全新系列Android Q(安卓10.0)操作系统, ...
- [Unity][安卓]unity获取唯一ID,游客登陆
之前做的时候在网上找了好多有现在整理下一个可以用的 代码段如下 在java中编写 public String GetID(){String serial = null;String m_szDevID ...
- Android Q(10.0)版本新特性和兼容性适配
北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了.Android Q 为开发者们带来了许多新 ...
- Android Q(10.0)上IMEI获取不到;Android Q(10.0)上OAID替代IMEI;OAID获取方式
最近公司研发的 Android Q (android 10)的5G手机,然后就开始适配Android Q:发现无系统权限的应用无法获取到可作为唯一标识的IMEI,MAC等等:由于项目(负一屏/浏览器/ ...
- Android 获取唯一Id
git:GitHub - gzu-liyujiang/Android_CN_OAID: 安卓设备唯一标识解决方案,可完全替代移动安全联盟统一 SDK 闭源方案.包括国内手机厂商的开放匿名标识(OAID ...
- android 获取唯一Id,小小总结一下。仅供参考
1.获取imei: 前言: 因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分, 并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应 ...
- Android: 实测安卓10下无法获取MEID的解决办法(附smali代码)_20200928_七侠镇莫尛貝
安卓10下: String meid = ((TelephonyManager) context.getSystemService("phone")).getDeviceId(); ...
- Android10获取唯一ID最佳做法
官方文档 安卓Q中Google彻底禁止第三发app获取IMEI,WIFI和蓝牙的MAC地址为:02:00:00:00:00:00. 1.使用实例 ID 和 GUID 对于实例 ID 不实用的情况,您还 ...
- Android Q(10.0 API29)版本新特性和兼容性适配
摘要 1.本文档基于谷歌AndroidQ官方文档和一加Q版本应用兼容性整改指导 2.本文档主要对影响比较大的部分进行简单总结,内容并不全面: 3.版本号对应关系: Android-Q = Androi ...
最新文章
- 小程序直播间页面路径怎么访问直播间_以小程序为例,在线教育产品的直播间有哪些功能设计?...
- 借助 IIS 管理器 -- 用手机测试HTML页面
- 【ABAP】BASE64加密及解密
- Java实现插入排序及其优化 insertion sort
- Volatility内存分析工具-某即时通讯软件Windows端数据库密钥的分析
- C#面向对象架构总结
- Access2016学习2
- aix oracle 创建实例,11gR2 for AIX使用dbca创建数据库遇到ORA-03113错误的案例
- 利用python的pyqt5和vtk库实现对gcode模型的全彩预览
- 论文翻译:2020_Improving Perceptual Quality By Phone-Fortified Perceptual Loss For Speech Enhancement...
- 电子工程师的自我修养 - 20例电路讲解
- 简易编程入门Part1
- 动手学习深度学习(Pytorch版)Task 2:文本预处理
- WKWebView 设置 UserAgent
- ns-3学习手记11_ofswitch13安装教程
- TensorFlow绘制loss/accuracy曲线
- 2022-11-08 Python基础知识 2
- js判断数组,对象,是否为空,是否含有某个值,判断数组中对象是否有某个值
- 计算机程序漏洞用英语怎么说,漏洞用英语怎么说
- sql 上一行减下一行_买大米时,不管什么牌子,只要包装袋上没这一行字,别买~...
热门文章
- 自行车存放管理系统c语言课程设计,基于51单片机的自行车智能辅助系统设计-(Proteus仿真图+源程序+论文)...
- MCMC法估计动力学模型参数
- 免费分享thinkphp框架开发周易八字起名网宝宝起名在线下单网站源码自适应可二开
- 优化算法——拟牛顿法之L-BFGS算法
- ROS路由系统esxi虚拟机ova模板下载,2G硬盘支持升级
- 计算机二级flash选择题,计算机二级模拟试题答案
- crow-han(基于go-micro框架的微服务脚手架)-01-快速启动(简介、快速启动、接口测试)
- 江苏计算机二级vc,江苏计算机二级(VC++)上机考试分析与策略
- python的PyObjC库
- Qpython安卓手机读取短信