坑逼的安卓厂商太多,没有可以可靠获取所有厂商设备唯一ID的方法,各个方法都有自己的使用范围和局限性,
这也是目前流行的Android系统版本过多,设备也是来自不同厂商,且没有统一标准等原因造成的。
比较常用的有:
1、DEVICE_ID
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后该值会被重置。
可以通过下面的方法获取:
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
StringSerialNumber= android.os.Build.SERIAL;
android 2.3以上和平板都可以用。
4、自己生成UUID
这种方式的原理是在程序安装后第一次运行时生成一个ID,该方式和设备唯一标识不一样,不同的应用程序会产生不同的ID,
同一个程序重新安装也会不同。所以这不是设备的唯一ID,但是可以保证每个用户的ID是不同的。可以说是用来标识每一
份应用程序的唯一ID(即Installtion ID),可以用来跟踪应用的安装数量等。
Google Developer Blog提供了这样的一个框架:
-
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 }