Android基础: 如何确定Android设备唯一识别码

本文探讨了如何在Android设备上获取唯一识别码,包括使用硬件标识如DEVICE_ID、ANDROID_ID、MAC_ADDRESS和SERIAL_NUMBER,以及使用UUID。虽然硬件标识具有唯一性和不变性,但在获取和隐私方面存在挑战。推荐的方案是结合硬件标识和UUID,存储在外部存储以确保不变性,并在应用全局统一管理。
摘要由CSDN通过智能技术生成

本文为转载文章,原文链接如下。如有侵权,联系后删除。
链接

在这里插入图片描述
唯一标识必须满足两个特性才能完美解决定位唯一设备的问题,但这个问题的解决却注定只能极限接近完美:
(1)唯一性:标识必须在所有使用该应用的设备上保持唯一性
(2)不变性:标识必须在同一设备上保持不变

一. 方向一:使用硬件标识

硬件标识实际上在硬件生产之时就被要求满足这两个特性(依然有人工生产的不确定性),但标识的获取趋于困难性,使得使用硬件标识作为唯一识别码的方案所能使用的范围越来越狭窄,不能作为全局方案使用。

1. 使用 DEVICE_ID

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
String deviceId = tm.getDeviceId();

2. 使用 ANDROID_ID

String androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

3. 使用 MAC ADDRESS

通过获取蓝牙或wifi的Mac地址 作为唯一识别号

wifiManager = ((WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE));
String macAddress = wifiManager.getConnectionInfo().getMacAddress();

4. 使用 SERIAL NUMBER

通过 android.os.Build.SERIAL来获取

5. 硬件标识的优势与局限性

优势:几乎完美满足唯一性与不变性

劣势:
在这里插入图片描述

二. 方向二 使用UUID

这也是官方推荐的生成的唯一标识码生成方式,有一点不同的时,官方方案(在这里)将生成的UUID存在应用内部存储当中,APP的卸载重装会导致发生更改;在实际使用当中我们可以存储到外部存储,除非人为的删除、损坏,这样它的不变性也得到了保障,而它的唯一性则由UUID来保证。

UUID的实现原理简析:
Wiki解释:通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)是用于计算机体系中以识别信息数目的一个128位标识符,还有相关的术语:全局唯一标识符(GUID)。根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性,这与其他大多数编号方案不同。重复UUID码概率接近零,可以忽略不计

组成: 8-4-4-4-12 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx M表示 UUID 版本,数字 N的一至三个最高有效位表示 UUID 变体

UUID根据版本不同,依赖的组成有不同的变种,基于时间的UUID版本是通过计算当前时间戳、随机数和机器MAC地址得到 。UUID的核心算法保证了即使在多处理器同时生成的UUID重复性为0,因为他们所在的时间、空间(节点:通常是MAC地址)必然不一致。

由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。

String uniqueID = UUID.randomUUID().toString();

三. 趋于完美的方案

尽可能的获取硬件标识来满足两个特性,在有限制或其他因素的条件下,尽可能满足不变性,将UUID存储在外部环境来进行读写。

(1)方案思路
尽可能的获取硬件标识
硬件标识为空,进行UUID的生成、存储

(2)方案说明:
需要在使用之前拿到设备信息权限(没有会导致DeviceID不可取,但仍然可用),外部存储读写权限(必须,否则不可用)
最好在Application中使用,唯一标识在app与服务器直接交互很常用,放在全局统一的地方方便管理使用

还有一种方案是拿到设备的某些唯一信息,生成特定的UUID,这样保持不变就可以跳过存储,但是既然拿到了唯一信息,那为啥还要生成UUID呢?

public class UniqueIDUtils {
   

    private static final String TAG = "UniqueIDUtils";
    private static String uniqueID;
    private static String uniqueKey = "unique_id";
    private static String uniqueIDDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath();
    private static String uniqueIDFile = "unique.txt";


    public static String getUniqueID(Context context) {
   
        //三步读取:内存中,存储的SP表中,外部存储文件中
        if (!TextUtils.isEmpty(uniqueID)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值