设备标识符

设备Id:
手机的唯一标识符,属于比较稳定的设备标识符。

缺陷:
    非手机设备没有
    6.0以后需要权限,需要用户手动确认。
    在一些设备制造商的设备商,这个值不准备

Mac Address
通过检索设备的wifi或蓝牙硬件获取设备的Mac地址

缺陷
    硬件限制:并不是所有的设备都有wifi和蓝牙硬件
    权限问题:需要wifistate权限和bluetooth权限
    系统限制:为了保护隐私,从android 6.0将不能获取到wifi和蓝牙有效的Mac地址

序列号
从Android2.3开始,可以获取设备的硬件序列号

Sim Serial Number
获取SIM卡的序列号

缺陷
    设备限制:仅装有sim的设备才能获取到
    权限问题:调用该方法需要read_phone_state权限
    Bug;对cdma设备,返回的是一个空值

Android_Id
设备第一次启动时产生和存储的64-bit字符串

缺陷:
    恢复出厂后可能会重置该值
    部分设备由于制造商错误实现,导致会返回相同的Android_id
    在Android4.2及以上,设备启动多用户功能后,每个用户的Android_id不相同

UUID
全局唯一标识符,是指在一台机器生成的数字,它保证对同一时空中的所有机器都是唯一的。

缺陷:
    无法做到设备唯一
//获取设备id
    public static synchronized String getDeviceID() {

        String deviceId = PreferenceUtils.getDeviceId();
        if (!TextUtils.isEmpty(deviceId)) {
            return deviceId;
        }
        String serial = serialNumber();
        String sep = "t";

        if (serial == null) {
            serial = "";
        }
        serial = serial.trim();

        deviceId = MD5.hexdigest(androidID() + sep + serial);

        if (!TextUtils.isEmpty(deviceId)) {
            PreferenceUtils.saveDeviceId(deviceId);
        }

        return deviceId;
    }
    //获取Androidid
    private static String androidID() {
        return Settings.Secure.getString(AppProfile.getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
    }
    //获取序列号
    private static String serialNumber() {
        return android.os.Build.SERIAL;
    }
    //获取手机imei
    private static String getPhoneIMEI(Context context) {
        TelephonyManager mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String imei = mTelephonyMgr.getDeviceId();
        return imei;
    }

    //获取mac地址
    private static String getWifiMacAddress(Context context) {
        try {
            WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            WifiInfo info = wifi.getConnectionInfo();//Caused by: java.lang.NullPointerException: name == null
            return info.getMacAddress();
        } catch (NullPointerException e) {
            return null;
        }
    }

相关内容推荐