获取唯一ID码

坑逼的安卓厂商太多,没有可以可靠获取所有厂商设备唯一ID的方法,各个方法都有自己的使用范围和局限性,

这也是目前流行的Android系统版本过多,设备也是来自不同厂商,且没有统一标准等原因造成的。

比较常用的有:

1、DEVICE_ID

  1. TelephonyManager tm =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);String DEVICE_ID = tm.getDeviceId();

根据不同的手机设备返回IMEI,MEID或者ESN码。

非手机设备:如平板,没有通话的硬件功能,系统中没有TELEPHONY_SERVICE,无法获得DEVICE_ID。

权限问题:获取DEVICE_ID需要READ_PHONE_STATE权限,如果只是为了获取DEVICE_ID而没有用到其他的通话功能,申请这个权限一来大才小用,二来部分用户会怀疑软件的安全性。

厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾。

2、ANDROID_ID

在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。

可以通过下面的方法获取:

  1. import android.provider.Settings;String ANDROID_ID =Settings.System.getString(getContentResolver(),Settings.System.ANDROID_ID);

ANDROID_ID可以作为设备标识,但是:

厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c;

厂商定制系统的Bug:有些设备返回的值为null;

设备差异:对于CDMA设备,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值;

3、Serial Number

  1. StringSerialNumber= android.os.Build.SERIAL;

android 2.3以上和平板都可以用。

4、自己生成UUID

这种方式的原理是在程序安装后第一次运行时生成一个ID,该方式和设备唯一标识不一样,不同的应用程序会产生不同的ID,

同一个程序重新安装也会不同。所以这不是设备的唯一ID,但是可以保证每个用户的ID是不同的。可以说是用来标识每一

份应用程序的唯一ID(即Installtion ID),可以用来跟踪应用的安装数量等。

Google Developer Blog提供了这样的一个框架:

  1.  1 publicclassInstallation{
     2     privatestaticString sID =null;
     3     privatestaticfinalString INSTALLATION ="INSTALLATION";
     4     publicsynchronizedstaticString id(Context context){
     5        if(sID ==null){
     6        File installation =newFile(context.getFilesDir(), INSTALLATION);
     7        try{
     8        if(!installation.exists())
     9         writeInstallationFile(installation);
    10         sID = readInstallationFile(installation);
    11         }
    12        catch(Exception e){
    13         thrownewRuntimeException(e);
    14        }
    15       }
    16      return sID;
    17     }
    18    privatestaticString readInstallationFile(File installation)throwsIOException{
    19      RandomAccessFile f =newRandomAccessFile(installation,"r");
    20      byte[] bytes =newbyte[(int) f.length()];
    21      f.readFully(bytes); f.close();returnnewString(bytes);
    22    }
    23    privatestaticvoid writeInstallationFile(File installation)throwsIOException{
    24      FileOutputStream out =newFileOutputStream(installation);
    25      String id = UUID.randomUUID().toString(); out.write(id.getBytes());
    26      out.close();
    27    }
    28 }
时间: 2024-08-02 14:48:35

获取唯一ID码的相关文章

20150919_获取Android唯一标识码

背景 前段时间给一家电力公司做了一个管理系统,用来调查公司客户的购买电力公司培训课程的意愿,并且提供下单订购的功能. 因为电力公司要求在Android平板电脑上运行,所以是针对7英寸的Android平板电脑的开发:苦于没有合适的设备调试,所以我一直在自己的Android手机上进行测试,一直到项目提交之前的那一天晚上... 客户反馈说提交订单后系统停止运行,导入数据到PC服务端后服务端也崩溃了! 刚开始怀疑是因为他们的设备太差的缘故——我在配置相当low的Android原生虚拟机(有多low大家应

获取Android设备唯一标识码

概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一性并不理想.而通过其他硬件信息标识也因为系统版本.手机硬件等限制存在不同程度的问题. 下面收集了一些“有能力”或“有一定能力”作为设备标识的串码. DEVICE_ID 这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且

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

唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure;private String android_id = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); 我们在项目过程中或多或少会使用到设备的唯一识别码,我们希望能够得到一个稳定.可靠的设备唯一识别码.今天我们将介绍几种方式. 1. DEVICE_ID 假

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

最近在做项目的过程中需要唯一标识用户的设备,后台在做push notification的时候需要用到这个唯一的标识号. 首先我会想到的是设备的device id,毫无疑问可以唯一标识设备,第一个版本也正是这样做的.国庆期间用户的一封邮件让哥很不淡定,因为需要拿到device id,所以必然要在AndroidManifest文件中添加权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" />

Java工具类:获取long型唯一ID

import java.text.SimpleDateFormat; import java.util.Date; /** * 获取long型唯一ID */ public class ID { private static long tmpID = 0; private static boolean tmpIDlocked = false; public static long getId() { long ltime = 0; while (true) { if(tmpIDlocked ==

根据用户id生成一个唯一邀请码

需求描述:根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'. 这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. 错误思路 随机生成一个字符串,再将用户id拼接到字符串后面,但是这样id就太明显了,容易暴露,而且如果id很长的话,会导致邀请码很长,不利于用户使用. 所以可以将用户id插入到生成的字符串中,隔一个字符插入一个id的数字,这样id混合在字符串中,不容易暴露,但是长度问题并没有得到优化,

PHP获取时间戳和微秒数以及生成唯一ID

microtime函数 描述:返回当前Unix时间戳和微秒数 语法:mixed microtime( [ bool $get_as_float ] ) //直接输出 echo microtime(); //得到的是 如:0.26672100 1585622985 前面是当前微秒数,后面是正常时间戳,中间以空格分隔开 //如果带有参数(布尔型参数) echo microtime(true); //输出结果:1585623020.7408 刚才的微秒数就会以浮点数的形式表现在原有的时间戳之后 浮点数

STM32全球唯一ID读取方法

产品唯一的身份标识非常适合:● 用来作为序列号(例如USB字符序列号或者其他的终端应用)● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性.● 用来激活带安全机制的自举过程96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的.用户在何种情况下,都不能修改这个身份标识.这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取.基地址:0x1F

分布式系统唯一ID生成方案汇总

系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见的ID生成策略. 1. 数据库自增长序列或字段 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理. 2)在单个数据库或