android获取设备唯一标识符

 
  
1、获取IMEI:

adb命令:adb shell dumpsys iphonesubinfo


手机设备查看:<1>*#06#(通话快捷查询)<2>设置--->关于手机--->状态消息--->IMEI <3>直接打开手机后盖,拆下电池,就可以在内部标签上找到IMEI串号

(添加权限)

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

String IMEIstr = telephonyManager.getDeviceId();

问题:

<1>非手机设备:比如平板电脑,不具有通话功能,无法获取TELEPHONY_SERVICE。

<2>厂商定制系统中的Bug:少数手机设备上会返回垃圾,如:zeros或者asterisks。

<3>假设是一个没有量产(上市:新开发的产品都要经过硬件及软件方面的测试,当这些测试都通过时,才能上市)的水货手机,获取可能为:0000000000000。

2、取ROM版本、制造商、CPU型号、以及其他硬件信息来实现:(遇到非手机设备或不愿意加入READ_PHONE_STATE)

String myPseudoIMEIStr = "35" + 
Build.BOARD.length()%10 + 
Build.BRAND.length()%10 + 
Build.CPU_ABI.length()%10 + 
Build.DEVICE.length()%10 + 
Build.DISPLAY.length()%10 + 
Build.HOST.length()%10 + 
Build.ID.length()%10 + 
Build.MANUFACTURER.length()%10 + 
Build.MODEL.length()%10 + 
Build.PRODUCT.length()%10 + 
Build.TAGS.length()%10 + 
Build.TYPE.length()%10 + 
Build.USER.length()%10 ; 
System.out.println(myPseudoIMEIStr);

:(adb查看手机设备信息)

android获取设备唯一标识符_第1张图片

  • android prop文件中存储硬件设备的重要信息:
  • getprop 查看机器的全部信息参数
    getprop ro.serialno 查看机器的序列号
    getprop ro.carrier 查看机器的CID号
    getprop ro.hardware 查看机器板子代号
    getprop ro.bootloader 查看SPL(Hboot)版本号

问题:如果两个手机应用了同样的硬件以及Rom 镜像,ID也不唯一

3、secure.ANDROID_ID:(无需任何权限许可)

String mySecureAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
System.out.println(mySecureAndroidID);

或:

String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID); 
System.out.println(ANDROID_ID);

问题:ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root(wipe后该值会被重置)过的话,这个ID也可以被任意改变。或是厂商定制系统的bug,会出现相同的ID或返回null,

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

4、获取WlanMac:

(添加权限)

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String myWlanMacStr = wifiManager.getConnectionInfo().getMacAddress();
System.out.println(myWlanMacStr);

问题:在WLAN不必打开就可以读取值,不是一个真实地址,并且地址可以伪造。(不可靠)

5、获取BluetoothMac:

(添加权限)

String myBoletoothStr = BluetoothAdapter.getDefaultAdapter().getAddress();      
System.out.println(myBoletoothStr);

问题:只在有蓝牙的设备上运行,蓝牙需要开启,否则无法获取到Mac信息。

6、自定义组合方式:(将以上5种方式通过拼接方式生成MD5)

String myCombinedDeviceID = myIMEIStr + myPseudoIMEIStr 
   + mySecureAndroidID+ myWlanMacStr + myBoletoothStr;      
MessageDigest messageDigest = null;   
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();   
}    
messageDigest.update(myCombinedDeviceID.getBytes(),0,myCombinedDeviceID.length());   
byte md5Data[] = messageDigest.digest();   
String myUniqueDeviceID = new String();   
for (int i=0;i    int b =  (0xFF & md5Data[i]);    
   if (b <= 0xF) 
    myUniqueDeviceID+="0";    
   myUniqueDeviceID+=Integer.toHexString(b); 
   myUniqueDeviceID = myUniqueDeviceID.toUpperCase();
}
System.out.println(myUniqueDeviceID);

结果:(第一个为本机真实IMEI,第二个为伪造的IMEI,之后为3、4、5的ID,最后一个产生32位的16进制数据)

android获取设备唯一标识符_第2张图片


你可能感兴趣的:(android开发常见问题)