美文网首页UtilsAndroid程序员
Android获取设备唯一标识

Android获取设备唯一标识

作者: 洪生鹏 | 来源:发表于2017-04-23 22:24 被阅读1337次

    今天分享点比较基础的东西,别小看这基础的东西,面试时,一个小小的知识点,有时能决定你是否被录用。笔者两年前就因为一个基础错过了一个Offer,深感遗憾。声明,本文讲的知识点过于基础,高手请直接关闭页面。

    今天分享的是获取Android设备唯一标识,希望对你有帮助。
    1、使用IMEI

        public synchronized static String getDeviceId(Context mContext) {
            TelephonyManager telephonyManager = (TelephonyManager)mContext.getSystemService(mContext.TELEPHONY_SERVICE);
            String deviceId= telephonyManager.getDeviceId();
            return deviceId;
        }
    

    需要在AndroidManifest.xml加上权限

      <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    

    注意,此方法只对手机有效,对于对讲机那类并不起效,获取不到。

    又比如Android 7.0 。

    2、MAC Address 使用网卡地址

    public synchronized static String getMacAddress(Context mContext) {
            WifiManager wm = (WifiManager)mContext.getSystemService(mContext.WIFI_SERVICE);
            String macAddress = wm.getConnectionInfo().getMacAddress();
            return macAddress ;
        }
    

    需要在AndroidManifest.xml加上权限

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    

    3、使用蓝牙地址

    public synchronized static String getMacId(Context mContext) {
            BluetoothAdapter bluetoothAdapter= BluetoothAdapter.getDefaultAdapter();
            String mBluethId= bluetoothAdapter.getAddress();
            return mBluethId;
        }
    

    需要在AndroidManifest.xml加上权限

        <uses-permission android:name="android.permission.BLUETOOTH"/>
    

    3、安装ID (Installtion ID)

    作为一枚Android开发者,我们都知道Android设备的多样性,考虑到平板没有通话功能,低端设备没有WLAN或者蓝牙功能,亦或是有些用户禁止了应用程序这些需要的权限。通过上面的方法我们就获取不到唯一标识了。下面我们使用Installtion ID,无需权限的方法;这种方式的原理是在程序安装后第一次运行时生成一个ID,该方式和设备唯一标识不一样,不同的应用程序会产生不同的ID,同一个程序重新安装ID也会不同。这不是设备的唯一ID,但是可以保证每个用户的ID是不同的。可以说是用来标识每一份应用程序的唯一ID(Installtion ID),可以用来跟踪应用的安装数量等。

    public synchronized static String getUUID(Context mContext) {
            if (sID == null) {
                File installation = new File(mContext.getFilesDir(), INSTALLATION);
                try {
                    if (!installation.exists()) {
                        writeInstallationFile(installation);
                    }
                    sID = readInstallationFile(installation);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            return sID;
        }
    
        private static String readInstallationFile(File installation) throws IOException {
            RandomAccessFile f = new RandomAccessFile(installation, "r");
            byte[] bytes = new byte[(int) f.length()];
            f.readFully(bytes);
            f.close();
            return new String(bytes);
        }
    
        private static void writeInstallationFile(File installation) throws IOException {
            FileOutputStream out = new FileOutputStream(installation);
            String id = UUID.randomUUID().toString();
            out.write(id.getBytes());
            out.close();
        }
    

    我们也可以考虑把上面获取的几个方法拼接后,计算出的MD5值来产生一个结果,也可以作为唯一的标识用。例如这样:

       public static String  getLongId(){
            String longId ="上面几个方法合并";
            MessageDigest messageDigest = null;
            try {
                messageDigest = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            messageDigest.update(longId.getBytes(),0,longId.length());
            byte md5Data[] = messageDigest.digest();
            String uniqueId = new String();
            for (int i=0;i<md5Data.length;i++) {
                int b = (0xFF & md5Data[i]);
                if (b <= 0xF) {
                    uniqueId+="0";
                }
                uniqueId+=Integer.toHexString(b);
            }
            return  uniqueId.toUpperCase();
        }
    

    [END]

    相关文章

      网友评论

      • ceb96b1591a1:MAC Address在Android M之后已经获取不到,准确的说在所有Android M设备上获取MAC Address得到的值全部是相同的;Installtion ID卸载重装也会变,都不靠谱😂,我现在是直接在设备存储上创建一个隐藏文件,直接读取文件md5值,只要文件不被删除就一直存在,没有sd卡的就保存在应用沙盒里,卸载重装了就重新生成,反正现在的设备几乎很少存在没有sd卡之说😁
      • 7d6682d0220c:这个好

      本文标题:Android获取设备唯一标识

      本文链接:https://www.haomeiwen.com/subject/jyxuzttx.html