Android 获取设备唯一UUID的一种实现方式

import android.content.Context;import android.content.SharedPreferences;import android.content.pm.PackageManager;import android.os.Build;import android.os.Environment;import android.provider.Settings.Secure;import android.telephony.TelephonyManager;import android.text.TextUtils;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.util.UUID;/** *  *  *  * targetSdkVersion 22 如果大于22增加动态权限管理 * 获取设备唯一UUID */public class DeviceUuidFactory {    private static final String DEVICE_UUID_FILE_NAME = ".tobindevid.conf";    private static final String DEVICE_IMEI_FILE_NAME = ".tobinimei.conf";    private static final String PREFS_FILE = "tobindevice_id.xml";    private static final String PREFS_DEVICE_ID = "device_id";    private static final String PREFS_IMEI = "imei";    private static UUID uuid;    private static String imei;    private static DeviceUuidFactory deviceUuidFactory;    public static DeviceUuidFactory getInstance(Context context){        if (deviceUuidFactory == null){            deviceUuidFactory = new DeviceUuidFactory(context);        }        return deviceUuidFactory;    }    private DeviceUuidFactory(Context context) {        if (uuid == null) {            synchronized (DeviceUuidFactory.class) {                if (uuid == null) {                    final SharedPreferences prefs = context.getSharedPreferences(PREFS_FILE, 0);                    String id = prefs.getString(PREFS_DEVICE_ID, null);                    String imeiStr = prefs.getString(PREFS_IMEI, null);                    if (TextUtils.isEmpty(id)) {                        if (checkPermission(context, permission.WRITE_EXTERNAL_STORAGE)) {                            id = recoverFromSD(DEVICE_UUID_FILE_NAME);                        }                    }                    if (TextUtils.isEmpty(imeiStr)) {                        if (checkPermission(context, permission.WRITE_EXTERNAL_STORAGE)) {                            imeiStr = recoverFromSD(DEVICE_IMEI_FILE_NAME);                        }                    }                    if (!TextUtils.isEmpty(imeiStr)) {                        imei = imeiStr;                        prefs.edit().putString(PREFS_IMEI, imei).commit();                        if (checkPermission(context, permission.WRITE_EXTERNAL_STORAGE)) {                            saveToSD(imei, DEVICE_IMEI_FILE_NAME);                        }                    }                    if (id != null) {                        // Use the ids previously computed and stored in the prefs file                        uuid = UUID.fromString(id);                        prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit();                        if (checkPermission(context, permission.WRITE_EXTERNAL_STORAGE)) {                            saveToSD(uuid.toString(), DEVICE_UUID_FILE_NAME);                        }                    } else {                        final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);                        String tmDevice, tmSerial;                        tmDevice = "";                        tmSerial = "";                        try {                            if (checkPermission(context, permission.READ_PHONE_STATE)) {                                TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);                                tmDevice = tm.getDeviceId();                                tmSerial = tm.getSimSerialNumber();                            }                        } catch (SecurityException ex) {                            ex.printStackTrace();                        }                        if (TextUtils.isEmpty(tmDevice) || TextUtils.isEmpty(tmSerial) || tmDevice.equals("000000000000000")) {                            if (!TextUtils.isEmpty(androidId) && !"9774d56d682e549c".equals(androidId) && Build.VERSION.SDK_INT <= Build.VERSION_CODES.O) {                                uuid = UUID.nameUUIDFromBytes(androidId.getBytes());                            } else {                                uuid = UUID.randomUUID();                            }                        } else {                            uuid = new UUID(androidId.hashCode(), ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());                        }                        if (!TextUtils.isEmpty(tmDevice)) {                            imei = tmDevice;                            prefs.edit().putString(PREFS_IMEI, imei).commit();                            if (checkPermission(context, permission.WRITE_EXTERNAL_STORAGE)) {                                saveToSD(imei, DEVICE_IMEI_FILE_NAME);                            }                        }                        // Write the value out to the prefs file                        prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit();                        if (checkPermission(context, permission.WRITE_EXTERNAL_STORAGE)) {                            saveToSD(uuid.toString(), DEVICE_UUID_FILE_NAME);                        }                    }                }            }        }    }    public UUID getDeviceUuid() {        return uuid;    }    private static void saveToSD(String uuid, String fileName) {        String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath();        File targetFile = new File(dirPath, fileName);        if (targetFile != null) {            if (!targetFile.exists()) {                OutputStreamWriter osw;                try {                    osw = new OutputStreamWriter(new FileOutputStream(targetFile), "utf-8");                    try {                        osw.write(uuid);                        osw.flush();                        osw.close();                    } catch (IOException e) {                        e.printStackTrace();                    }                } catch (UnsupportedEncodingException e) {                    e.printStackTrace();                } catch (FileNotFoundException e) {                    e.printStackTrace();                }            }        }    }    private static String recoverFromSD(String fileName) {        try {            String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath();            File dir = new File(dirPath);            File uuidFile = new File(dir, fileName);            if (!dir.exists() || !uuidFile.exists()) {                return null;            }            FileReader fileReader = new FileReader(uuidFile);            StringBuilder sb = new StringBuilder();            char[] buffer = new char[100];            int readCount;            while ((readCount = fileReader.read(buffer)) > 0) {                sb.append(buffer, 0, readCount);            }            fileReader.close();            return sb.toString();        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    private boolean checkPermission(Context context, permission permName) {        int perm = context.checkCallingOrSelfPermission("android.permission." + permName.toString());        return perm == PackageManager.PERMISSION_GRANTED;    }    private enum permission {        READ_PHONE_STATE,        WRITE_EXTERNAL_STORAGE    }}

测试输出

Log.i("Tobin", "获取UUID:" + DeviceUuidFactory.getInstance(this).getDeviceUuid());
  • I/Tobin: 获取信息:获取UUID:00000000-7501-f67b-ffff-ffff8304d3e6

更多相关文章

  1. Android uses-permission权限
  2. Android 8.0 权限警告(not in privapp-permissions whitelist)解决
  3. android邮件发送几种方式
  4. Android通过http协议POST传输方式(输出流提交到服务端)
  5. Android获取设备状态栏status bar高度的正确姿势
  6. Android的所有权限说明
  7. android 权限汇集
  8. FAQ_05_查看 android 设备 ip
  9. android 模拟器获取root权限

随机推荐

  1. 关于android的Notification的若干问题
  2. android 集合与json之间的相互转换
  3. Android | 代码混淆到底做了什么?
  4. Android 蓝牙开发研究
  5. 一起学android之DigitalClock与TextClock
  6. Android 消息机制学习
  7. android中在java代码中设置Button按钮的
  8. Android 工程目录结构介绍
  9. vue H5与(Android、iOS)原生APP交互
  10. Android不再使用Oracle专属的Java API将