adb命令:adb shell dumpsys iphonesubinfo
手机设备查看:<1>*#06#(通话快捷查询)<2>设置--->关于手机--->状态消息--->IMEI <3>直接打开手机后盖,拆下电池,就可以在内部标签上找到IMEI串号
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查看手机设备信息)
问题:如果两个手机应用了同样的硬件以及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
if (b <= 0xF)
myUniqueDeviceID+="0";
myUniqueDeviceID+=Integer.toHexString(b);
myUniqueDeviceID = myUniqueDeviceID.toUpperCase();
}
System.out.println(myUniqueDeviceID);
结果:(第一个为本机真实IMEI,第二个为伪造的IMEI,之后为3、4、5的ID,最后一个产生32位的16进制数据)