在我们的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设备的唯一标识码(Android 6.0或更高)的更多相关文章

  1. 怎样获取ios设备的唯一标识

    非常多地方都会须要用到唯一标志. 比方: 1. 我们相用一个设备的唯一标志当作用户id,特别是网络游戏,这样就能够省去注冊的麻烦. 2. 想把app相关的文件加密,密钥哪里来的?有些人可能会说hard ...

  2. DeviceUuidFactory【获取设备唯一标识码的UUID(加密)】【需要运行时权限的处理的配合】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于An ...

  3. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  4. Android 获取设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  5. Android 手机上获取物理唯一标识码[转]

    所有添加有谷歌账户的设备可以返回一个 ANDROID_ID 所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添 ...

  6. Android 手机上获取物理唯一标识码

    唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure;private String android_id ...

  7. iOS 获取设备的唯一标识

    有时候,我们需要记录一下设备的唯一标识,比如标识这个设备是不是已经发过促销券了或者是否下载试用过app等等.最简单 的方法就是获取设备的UDID#[UIDevice currentDevice] un ...

  8. android开发获取网络状态,wifi,wap,2g,3g.工具类(一)

    android开发获取网络状态整理: package com.gzcivil.utils; import android.content.Context; import android.net.Con ...

  9. 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

随机推荐

  1. Git及其二次开发

    Git And TFS: 将 Visual Studio 用于 Git:http://msdn.microsoft.com/zh-cn/library/hh850437.aspx TFVC 和 Git ...

  2. socketserver模块实现并发和连接合法性验证

    一.socketserver模块 1.sockeserver的源码流程 2.简单的使用 socketserver服务端 import socketserver class MyServer(socke ...

  3. 2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的 ...

  4. s5-1 CPU调度

    基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...

  5. Eclipse的maven项目一直无故报错

    maven项目里面没报错,就是项目名称上有红色的叉叉,看着很不舒服: install都成功,但还是有红叉,刷新也没有用,最后搞了好一会才好: 操作步骤: 1.先把项目clean下: 选中要清理的项目, ...

  6. javascript 经典问题汇总

    1. ["1","2","3"].map(parseInt) 为多少?答:[1,NaN,NaN]array.map(function(cur ...

  7. Jersey RESTful WebService框架学习(一)

    介绍:RESTful (Representation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding 的博士 ...

  8. AngularJS实战之Controller之间的通信

    我们时常会在不同controller之间进行通信,接下来就介绍三种controller之间的通信方式 一.使用$on.$emit和$broadcast进行controller通信 虽然AngularJ ...

  9. GCC基础知识学习

    GCC基础知识学习 一.GCC编译选项解析 常用编译选项 命令格式:gcc [选项] [文件名] -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -c:仅执行编译操作,不进行连接操作: -o ...

  10. Silverlight中关于ComboBox的各种使用

    前端放置了几个ComboBox的控件. <Grid x:Name="LayoutRoot" Background="White"> <Comb ...