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