欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解关于AndroidQ获取不到imsi解决方案

程序员文章站 2022-05-21 21:19:29
android q 禁止获取 imei 和设备序列号; 官方的解决方案是这样: 结合官方实现方案和实际需求自己整理的实现方法如下: 方案一: /** * 获取设备唯...

android q 禁止获取 imei 和设备序列号;

官方的解决方案是这样:

结合官方实现方案和实际需求自己整理的实现方法如下:

方案一:

/**
 * 获取设备唯一标识符
 *
 * @return 唯一标识符
 */
public static string getdeviceid() {
  // 通过 sharedpreferences 获取 guid
  string guid = sputils.getinstance().getstring(appconfig.sp_guid);
  if (!textutils.isempty(guid)) {
    return guid;
  }
 
  // 获取 android_id
  string android_id = settings.system.getstring(
      app.getapp().getcontentresolver(), settings.secure.android_id);
  if (!textutils.isempty(android_id)) {
    // 通过 android_id 生成 guid(唯一标识符)
    guid = encryptutils.encryptmd5tostring(android_id);
  } else {
    // 通过 uuid 生成 guid(唯一标识符)
    guid = encryptutils.encryptmd5tostring(uuid.randomuuid().tostring());
  }
  // 保存 guid 到 sharedpreferences
  sputils.getinstance().put(appconfig.sp_guid, guid);
  return guid;
}

上面 sputils 是自己封装的 sharedpreferences 的一个工具类。

方案二:

/**
 * 获取设备唯一标识符
 *
 * @return 唯一标识符
 */
@suppresslint("hardwareids")
public static string getdeviceid() {
  string m_szdevidshort = "35" + build.board.length() % 10
      + build.brand.length() % 10 + build.cpu_abi.length() % 10
      + build.device.length() % 10 + build.display.length() % 10
      + build.host.length() % 10 + build.id.length() % 10
      + build.manufacturer.length() % 10 + build.model.length() % 10
      + build.product.length() % 10 + build.tags.length() % 10
      + build.type.length() % 10 + build.user.length() % 10;// 13 位

  string serial = "serial";// 默认serial可随便定义
  try {
    if (build.version.sdk_int >= build.version_codes.o) {
      if (activitycompat.checkselfpermission(app.getapp(),
          manifest.permission.read_phone_state) == packagemanager.permission_granted) {
        // 由于 android q 唯一标识符权限的更改会导致
        // android.os.build.getserial() 返回 unknown,
        // 但是 m_szdevidshort 是由硬件信息拼出来的,所以仍然保证了uuid 的唯一性和持久性。
        serial = android.os.build.getserial();// android q 中返回 unknown
      }
    } else {
      serial = build.serial;
    }
  } catch (exception ignored) {
  }
  return new uuid(m_szdevidshort.hashcode(), serial.hashcode()).tostring();
}

由于m_szdevidshort是由硬件信息拼出来的,所以保证了uuid的唯一性和持久性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。