Android 获取设备唯一UUID
16lz
2021-01-23
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
更多相关文章
- Android uses-permission权限
- Android 8.0 权限警告(not in privapp-permissions whitelist)解决
- android邮件发送几种方式
- Android通过http协议POST传输方式(输出流提交到服务端)
- Android获取设备状态栏status bar高度的正确姿势
- Android的所有权限说明
- android 权限汇集
- FAQ_05_查看 android 设备 ip
- android 模拟器获取root权限