首页 > 技术文章 > 获取唯一ID码

fruitbolgs 2015-08-21 14:43 原文

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

推荐阅读