Android 获取唯一标识符

以下亲测!

获取ANDROID_ID:

在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是,但是当设备被wipe,ROOT,恢复出厂设置,后该值会被重置,

厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c。 (其他文章说,未测出,应该几率小)
厂商定制系统的Bug:有些设备返回的值为null。 (其他文章说,未测出,应该几率小)

看了很多文章都是用的:(注:小于API16实用,在api16中不会提示过期)

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

api>17则提示废弃(Deprecated),可以使用下面方法:

String ANDROID_ID = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

Serial Number:

设备唯一序列号

很多文章使用String SerialNumber = android.os.Build.SERIAL; 进行获取,亲测小米8获取值为unknown,不敢用,哈哈

MAC地址:

概念:可以使用手机Wifi或蓝牙的MAC地址作为设备标识。 
不足: 如果设备没有支持WIFI的硬件,就返回null;

Android 6.0(API23) 之前,获得Mac地址的通用方式

必须的权限 < uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

WifiManager wifiManager=(WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo=wifiManager.getConnectionInfo();
String mac=wifiInfo.getMacAddress();

从6.0后,权限被拒绝,从网上找到了另一种方案,通过扫描各个网络接口来获取Mac地址,并且这种方式在Android 6.0上同样有效

网上说需要权限 < uses-permission android:name="android.permission.INTERNET" />
亲测,没有该权限也能获取。。。

    public String getMacAddress() {
        try {
            List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface nif : all) {
                if (!nif.getName().equalsIgnoreCase("wlan0")) continue;

                byte[] macBytes = nif.getHardwareAddress();
                if (macBytes == null) {
                    return "";
                }
                StringBuilder res1 = new StringBuilder();
                for (byte b : macBytes) {
                    res1.append(String.format("%02X:",b));
                }
                if (res1.length() > 0) {
                    res1.deleteCharAt(res1.length() - 1);
                }
                return res1.toString();
            }
        } catch (Exception ex) {
        }
        return "02:00:00:00:00:00";
    }

DEVICE_ID:

概念: 是区别移动设备的标志,储存在移动设备中,可用于监控被窃或无效的移动设备。 
优点: 
1.根据不同的手机设备返回IMEI,MEID或者ESN码,唯一性良好 。
不足:
1.非手机:如平板电脑,像这样设备没有通话的硬件功能,系统中也就没有TELEPHONY_SERVICE,自然也就无法获得DEVICE_ID; 
2.权限问题:<uses-permission android:name="android.permission.READ_PHONE_STATE" />
3.厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾,如:00000000或者****
当设备为手机时,返回设备的唯一ID。手机制式为 GSM 时,返回手机的 IMEI 。手机制式为 CDMA 时,返回手机的 MEID 或 ESN 。

    public String getDeviceId(){
        if (Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
                final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                return tm.getDeviceId();
            }
        }
    else{
          final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
          return tm.getDeviceId();
        }
        return null;
    }

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值