获取唯一ID码

本文深入分析了Android系统中获取设备唯一ID的多种方法及其局限性,包括DEVICE_ID、ANDROID_ID、SerialNumber和自动生成UUID,并讨论了各方法在不同设备和系统定制下的表现和潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

坑逼的安卓厂商太多,没有可以可靠获取所有厂商设备唯一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 }

转载于:https://www.cnblogs.com/fruitbolgs/p/4747854.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值