Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)

易娃 等级 658 0 0

在我们的APP开发中,通常需要获取到设备的唯一标识。在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬件信息。

Android6.0之前的方法(已过时)

  1. DEVICE_ID
    通getSystemService(Context.TELEPHONY_SERVICE).getDeviceId()获取,但是6.0之后必须申请READ_PHONE_STATE,并且获取到的这个值在不同的厂商和设备中并不可靠。

  2. MAC地址
    这个是无线网卡的MAC地址,这个需要ACCESS_WIFI_STATE权限,并且很多情况下并获取不到这个值,也并不是十分可靠。

  3. ANDROID_ID
    这个值是当一个新的设备第一次启动时,或者恢复出厂设置时,系统会生成一个64位的数字,这个值目前(Android4.0之后)已经非常可靠,但是仍有个别厂商的定制系统的BUG,导致这个值返回null。

获取设备唯一标识的正确姿势

由于ANDROID_ID的值相对稳定和可靠,并且不需要申请权限,所以我们获取设备的唯一标识应该使用这个值,同时我们应该考虑到一些极端情况和安全问题。

  1. 获取ANDROID_ID
public static String getAndroidID() {
    String id = Settings.Secure.getString(
            Utils.getApp().getContentResolver(),
            Settings.Secure.ANDROID_ID
    );
    return id == null ? "" : id;
} 
  1. 构造UUID,防止直接暴露ANDROID_ID
private static String getDeviceUUid()
{
   String androidId = DeviceUtils.getAndroidID();
   UUID deviceUuid = new UUID(androidId.hashCode(), ((long)androidId.hashCode() << 32));
   return deviceUuid.toString();
} 
  1. 考虑极端情况,我们自己生成一个应用级别的UUID
    这种情况我们需要将生成的UUID保存到SharedPreference中,只要应用不被卸载或者清除数据,这个值就不会变。
private static String getAppUUid() {
   String uuid = SPUtils.getInstance().getString(PREF_KEY_UUID);
   if (TextUtils.isEmpty(uuid)) {
       uuid = UUID.randomUUID().toString();
       //这里需要保存到SharedPreference中
       ...
   }
   return uuid;
} 
  1. 将上面的获取方法封装到一个方法中
public static String getUUID() {
    String uuid = getDeviceUUid();
    if (TextUtils.isEmpty(uuid)) {
        uuid = getAppUUid();
    }
    return uuid;
} 

总结

这些获取UUID方法非常简单,并且在应用的开发中可以满足99%的需求,不需要动态申请权限,也非常可靠,但是在使用时需要清楚其生成过程,以便应用到安全性要求非常高的场景中。

收藏
评论区

相关推荐

Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)
在我们的APP开发中,通常需要获取到设备的唯一标识。在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬件信息。 Android6.0之前的方法(已过时) 1. DEVICE\_ID 通getSystem
Android开发 常见异常和解决办法(一)
Android Studio是Android开发的理想工具,但是由于版本的更新和配置的差异,会出现很多问题,下面是以《第一行代码 第二版》为基础进行开发学习可能遇见的一些问题及其解决办法。 1.Android Studio 3.0及以上版本找不到Android Device Monitor: 解决办法: (1)在Android Studio中打开终端,如下
Android 自学必备网站
一,Android 自学网站给 Android 自学者朋友推荐几个自学网站:1. Android Developers作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会。网站:https://developer.android.com/2. Android专业中文社区Android专业
java编程中使用二进制进行权限或状态控制
直接看代码以及注释吧。 @Test public void main() { // PC WEB端 int pc = 1 << 0;// ...0001=1 // Android端 int android = 1 <<
Android_sdk目录结构详解
AndroidSDK(Android软件开发工具包,全称android softwaredevelop tools kit) 谷歌提供的 Android开发工具包,在开发 Android程序时,我们需要通过引入该工具包,来使用 Android相关的 API。 ![](https://static.oschina.net/uploads/img/20160
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言 ======= 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《[Android P正式版即将到来:后台应用保活、消息推送的真正噩梦](https://www.oschina
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言 ======= 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《[Android P正式版即将到来:后台应用保活、消息推送的真正噩梦](https://www.oschina
Andriod SDK Manager国内无法更新的解决方案
由于GWF,使用android sdk manager无法更新了,另外android源码也下载不了,幸而国内有很多开源镜像,可以帮助我们解决这些问题 1\. 如何更新Android SDK Manager 设置代理host为mirrors.neusoft.edu.cn,端口为80,即可正常同步 ![](http://static.oschina.net
Android
这篇其实可以不写的,但看到网上没有这方面的文章,觉得还是写一下澄清一下比较好,以便一些不太懂电脑的非计算机专业同学与初入门的计算机专业同学在碰到Android中毒的问题时不要陷入无谓的恐慌或误区。要知道,手机特别是ANDROID手机是非常安全的。它至少比电脑安全100倍。 Android自身几乎是不可能中毒的。 为什么这么说? 因为我们都知道,Andro
Android SDK Android Studio Android NDK 官方下载地址
2014.12 Android Studio https://dl.google.com/dl/android/studio/install/1.0.1/android-studio-bundle-135.1641136.exe https://dl.google.com/dl/android/studio/install/1.0.1/andro
Android Studio单元测试
啄木鸟软件测试培训网:www.3testing.com 今天简单介绍下**Android** Studio 使用代码进行**单元测试**。   Android Studio默认是支持**JUnit**和Android单元测试的,市面上大多主要讲解的是JUnit的单元测试,而没有侧重的讲解Android Studio针对Android的测试,今天主要介绍A
Android 一共有多少种动画?准确告诉你!
![Android 动画](http://obbu6r1mi.bkt.clouddn.com/github/androidanimationset/FnCS.gif) Android 动画在开发中是不可或缺的功能,或者说是界面灵动的添加剂。那你是否总结过 Android 中总共为开发者提供了多少种方式的动画呢?今天就为大家总结归纳一下。 ![报告老师,我
Android+Spring Boot 选择+上传+下载文件
2021.02.03更新 ============ 1 概述 ==== 前端`Android`,上传与下载文件,使用`OkHttp`处理请求,后端使用`Spring Boot`,处理`Android`发送来的上传与下载请求。这个其实不难,就是特别多奇奇怪怪的坑,因此,就一句话, 希望各位读者能少走弯路。 2 环境 ==== * `Win10` *
Android上可执行ELF文件中的段不能有基址
Android上可执行ELF文件中的段不能有基址 ======================== @(Android研究)\[android\] * * * \[TOC\] * * * 场景 -- 我使用Android NDK的编译工具交叉编译qemu项目([编译可在Android上运行的qemu user mode](http://my.os
Html5混合开发环境的H5牛牛平台搭建
工具:Android SDK,Java JDK,Node.js,Cordova、Ionic、python; 1、androd 需要配置:jdk路径和sdk 配置; jdk配置环境变量: JAVA\_HOME:jdk安装目录,如:F:\\Java\\jdk1.8.0\_11 %JAVA\_HOME%\\bin;%JAVA\_HOME%\\jre\\bi