首页 > 编程知识 正文

android获取手机唯一标识,手机唯一识别标识码

时间:2023-05-04 16:57:20 阅读:248884 作者:896

项目需求:公司项目有打卡功能,需要实现每个手机只能给一个用户打卡,这就需要用到手机唯一标识码。

通常获取手机唯一标识码,我们都是默认使用DeviceId或者IMEI。

final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, androidId; tmDevice = "" + tm.getDeviceId(); tmSerial = "" + tm.getSimSerialNumber(); androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); String deviceId = deviceUuid.toString();

但是自 Android 10(API 级别 29)起,您的应用必须是设备或个人资料所有者应用,具有特殊运营商许可,或具有 READ_PRIVILEGED_PHONE_STATE 特权,才能访问不可重置的设备标识符。

android studio 升级后,我将targetSdkVersion设置成了30,然后用户权限里开启了READ_PRIVILEGED_PHONE_STATE,但是这个权限在 API 级别 29以后不能使用,如果要使用需要将targetSdkVersion改成低于29,比如将targetSdkVersion改成了28就没有问了。

不过这么做治标不治本,先提供一个工具类供大家借鉴。

public class DeviceIdUtil { /** * 获得设备硬件标识 * * @param context 上下文 * @return 设备硬件标识 */ public static String getDeviceId(Context context) { StringBuilder sbDeviceId = new StringBuilder(); //获得设备默认IMEI(>=6.0 需要ReadPhoneState权限) String imei = getIMEI(context); //获得AndroidId(无需权限) String androidid = getAndroidId(context); //获得设备序列号(无需权限) String serial = getSERIAL(); //获得硬件uuid(根据硬件相关属性,生成uuid)(无需权限) String uuid = getDeviceUUID().replace("-", ""); //追加imei if (imei != null && imei.length() > 0) { sbDeviceId.append(imei); sbDeviceId.append("|"); } //追加androidid if (androidid != null && androidid.length() > 0) { sbDeviceId.append(androidid); sbDeviceId.append("|"); } //追加serial if (serial != null && serial.length() > 0) { sbDeviceId.append(serial); sbDeviceId.append("|"); } //追加硬件uuid if (uuid != null && uuid.length() > 0) { sbDeviceId.append(uuid); } //生成SHA1,统一DeviceId长度 if (sbDeviceId.length() > 0) { try { byte[] hash = getHashByString(sbDeviceId.toString()); String sha1 = bytesToHex(hash); if (sha1 != null && sha1.length() > 0) { //返回最终的DeviceId return sha1; } } catch (Exception ex) { ex.printStackTrace(); } } //如果以上硬件标识数据均无法获得, //则DeviceId默认使用系统随机数,这样保证DeviceId不为空 return UUID.randomUUID().toString().replace("-", ""); } //需要获得READ_PHONE_STATE权限,>=6.0,默认返回null @SuppressLint("MissingPermission") private static String getIMEI(Context context) { try { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getDeviceId(); } catch (Exception ex) { ex.printStackTrace(); } return ""; } /** * 获得设备的AndroidId * * @param context 上下文 * @return 设备的AndroidId */ private static String getAndroidId(Context context) { try { return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); } catch (Exception ex) { ex.printStackTrace(); } return ""; } /** * 获得设备序列号(如:WTK7N16923005607), 个别设备无法获取 * * @return 设备序列号 */ private static String getSERIAL() { try { return Build.SERIAL; } catch (Exception ex) { ex.printStackTrace(); } return ""; } /** * 获得设备硬件uuid * 使用硬件信息,计算出一个随机数 * * @return 设备硬件uuid */ private static String getDeviceUUID() { try { String dev = "3883756" + Build.BOARD.length() % 10 + Build.BRAND.length() % 10 + Build.DEVICE.length() % 10 + Build.HARDWARE.length() % 10 + Build.ID.length() % 10 + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 + Build.SERIAL.length() % 10; return new UUID(dev.hashCode(), Build.SERIAL.hashCode()).toString(); } catch (Exception ex) { ex.printStackTrace(); return ""; } } /** * 取SHA1 * @param data 数据 * @return 对应的hash值 */ private static byte[] getHashByString(String data) { try{ MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); messageDigest.reset(); messageDigest.update(data.getBytes("UTF-8")); return messageDigest.digest(); } catch (Exception e){ return "".getBytes(); } } /** * 转16进制字符串 * @param data 数据 * @return 16进制字符串 */ private static String bytesToHex(byte[] data){ StringBuilder sb = new StringBuilder(); String stmp; for (int n = 0; n < data.length; n++){ stmp = (Integer.toHexString(data[n] & 0xFF)); if (stmp.length() == 1) sb.append("0"); sb.append(stmp); } return sb.toString().toUpperCase(Locale.CHINA); }}

此工具类是将IMEI、androId、设备序列号以及根据硬件相关属性拼接而成。

使用时,只需要

DeviceIdUtil.getDeviceId(context)即可。
win7电脑文件夹如何加密jquery如何实现双击隐藏元素Linux下的Anaconda的配置

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。