安卓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(最优解)相关推荐

  1. 谷歌手机升级android10,Android Q安卓10.0新特性,首批支持升级21款手机

    原标题:Android Q安卓10.0新特性,首批支持升级21款手机 2019年5月8日,一年一度的谷歌I/O开发者大会在美国加州如期召开,并发布了全新系列Android Q(安卓10.0)操作系统, ...

  2. [Unity][安卓]unity获取唯一ID,游客登陆

    之前做的时候在网上找了好多有现在整理下一个可以用的 代码段如下 在java中编写 public String GetID(){String serial = null;String m_szDevID ...

  3. Android Q(10.0)版本新特性和兼容性适配

    北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了.Android Q 为开发者们带来了许多新 ...

  4. Android Q(10.0)上IMEI获取不到;Android Q(10.0)上OAID替代IMEI;OAID获取方式

    最近公司研发的 Android Q (android 10)的5G手机,然后就开始适配Android Q:发现无系统权限的应用无法获取到可作为唯一标识的IMEI,MAC等等:由于项目(负一屏/浏览器/ ...

  5. Android 获取唯一Id

    git:GitHub - gzu-liyujiang/Android_CN_OAID: 安卓设备唯一标识解决方案,可完全替代移动安全联盟统一 SDK 闭源方案.包括国内手机厂商的开放匿名标识(OAID ...

  6. android 获取唯一Id,小小总结一下。仅供参考

    1.获取imei: 前言: 因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分, 并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应 ...

  7. Android: 实测安卓10下无法获取MEID的解决办法(附smali代码)_20200928_七侠镇莫尛貝

    安卓10下: String meid = ((TelephonyManager) context.getSystemService("phone")).getDeviceId(); ...

  8. Android10获取唯一ID最佳做法

    官方文档 安卓Q中Google彻底禁止第三发app获取IMEI,WIFI和蓝牙的MAC地址为:02:00:00:00:00:00. 1.使用实例 ID 和 GUID 对于实例 ID 不实用的情况,您还 ...

  9. Android Q(10.0 API29)版本新特性和兼容性适配

    摘要 1.本文档基于谷歌AndroidQ官方文档和一加Q版本应用兼容性整改指导 2.本文档主要对影响比较大的部分进行简单总结,内容并不全面: 3.版本号对应关系: Android-Q = Androi ...

最新文章

  1. 计算体系结构的演进规律
  2. 记一次JVM Metaspace溢出排查
  3. slice_Spring Boot Web Slice测试–示例
  4. pcl画圆球_PCL之轨迹绘制(二)
  5. 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域
  6. html华文行楷的英文,字体英文代码.htm
  7. 微信小程序 登陆过期,请重新授权
  8. 利用PS将图片上的中文改写成英文
  9. 企业如何选择?网站建设中常见的几种类型
  10. 风口上的猪-中国牛市
  11. MATLAB不能打字,电脑不能打字怎么办?电脑打字打不出来解决方法汇总
  12. wifi的 2.4G 和5G
  13. 目标检测中的Anchor
  14. 台式计算机idc数据排名,2019年电脑销量排行_IDC:2019年中国PC市场预测销量持续走低...
  15. 使用Matlab对二值图像进行轮廓提取
  16. 洛谷 P2057 善意的投票
  17. Android初学习
  18. 【下载】【you-get】用电脑下载网页视频
  19. 学习OpenCV3:判断两条直线平行,并计算平行距离
  20. 白话空间统计二十一:密度分析(一)

热门文章

  1. 2021-04-10 Nginx配置移动端和电脑端自动双向跳转
  2. .NET Framework 不同版本之间区别
  3. AD18 所有过孔盖油
  4. 2022-2028全球笔式万用表行业调研及趋势分析报告
  5. 外挂电容触摸屏总结(一)
  6. 三星电视畅享“睛”彩, 6.18狂欢提前购即将开启
  7. PAT——1114 全素日
  8. 几何用计算机,平面几何
  9. 游戏编程入门(6):开发 Brainiac(记忆对对碰) 游戏
  10. 面了个 4 年 经验的,一问三不知还自认为很牛逼,真是醉了。。