因为很多软件都有这个功能,所以说是非常重要的,比如说一个用户账号只能绑定3个设备,那么得到设备的唯一标示将是非常重要的。
我猜那么你肯定首先想到的就是得到设备IMEI,
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
String IMEI= telephonyManager.getDeviceId();
通过getDeviceId
获取的为IMEI
和MEID
和ESN
这种方法我以前也在用,但是用了后你会发现,它其实有很多缺点:
- 需要android.permission.READ_PHONE_STATE权限,有可能被用户拒绝授权。
- 有的手机可能拿不到DeviceId。
其实我们可以自己组建唯一标识,比如说用build类获取手机的所有配置信息。
主板: Build.BOARD;
系统启动程序版本号: Build.BOOTLOADER;
系统定制商:Build.BRAND;
cpu指令集:Build.CPU_ABI;
cpu指令集2:Build.CPU_ABI2;
设置参数:Build.DEVICE;
显示屏参数:Build.DISPLAY;
无线电固件版本:Build.getRadioVersion(;
硬件识别码:Build.FINGERPRINT;
硬件名称:Build.HARDWARE;
HOST:Build.HOST;
修订版本列表:Build.ID;
硬件制造商:Build.MANUFACTURER;
版本:Build.MODEL;
硬件序列号:Build.SERIAL;
手机制造商:Build.PRODUCT;
描述Build的标签:Build.TAGS;
TIME:Build.TIME;
builder类型:Build.TYPE;
USER:Build.USER;
所以我后面写了这个方法,目前来看能保持唯一性,直接获取手机所有的信息并且组成一个新的字符串。
public static String getDeviceID() {
String deviceID= "";
try{
//一共13位 如果位数不够可以继续添加其他信息
m_szDevIDShort= ""+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;
}catch (Exception e){
return "";
}
return deviceID;
}