鸿蒙NEXT开发设备相关工具类(ArkTs)

复制代码
import { vibrator, VibratorStopMode } from '@kit.SensorServiceKit';
import { LogUtil } from './LogUtil';
import { resourceManager, DeviceType, Direction, ScreenDensity } from '@kit.LocalizationKit';
import { StrUtil } from './StrUtil';
import { AssetUtil } from './AssetUtil';
import { PreferencesUtil } from './PreferencesUtil';
import { RandomUtil } from './RandomUtil';
import deviceInfo from '@ohos.deviceInfo';
import { ResUtil } from './ResUtil';
import { identifier } from '@kit.AdsKit';
export const DEVICE_ID_KEY: string = "device_id_cache_harmony_key"; //设备ID的Key
/**
 * 定义移除操作的存储方法接口
 */
interface StorageMethodForRemove {
  removeSync: (key: string) => void;
}

/**
 * 定义获取和添加操作的存储方法接口
 */
interface StorageMethodForGetAdd {
  getSync: (key: string) => string | null;
  addSync: (key: string, value: string) => void;
}

/**
 * 设备相关工具类。
 * 提供设备信息、配置、能力、振动等功能的访问。
 *
 * @author 鸿蒙布道师
 * @since 2025/04/09
 */
export class DeviceUtil {
  private static deviceId: string = ''; // 设备ID
  /**
   * 获取设备ID(卸载APP后依旧不变)。
   * 如果未生成过设备ID,则会自动生成并存储。
   *
   * @param rule 是否包含 `-`,默认为 true。
   * @param generateId 自定义生成的ID(可选)。
   * @returns 返回设备ID。
   */
  static getDeviceId(rule: boolean = true, generateId?: string): string {
    if (StrUtil.isEmpty(DeviceUtil.deviceId)) {
      // 使用定义的接口类型
      const storageMethod: StorageMethodForGetAdd = AssetUtil.canIUse()
        ? AssetUtil
        : PreferencesUtil;

      const storedId: string | null = storageMethod.getSync(DEVICE_ID_KEY);
      let deviceId: string = StrUtil.toStr(storedId);

      if (StrUtil.isEmpty(deviceId)) {
        deviceId = generateId && StrUtil.isNotEmpty(generateId)
          ? generateId
          : RandomUtil.generateRandomUUID(true);

        if (!rule) {
          deviceId = deviceId.replace(/-/g, '');
        }

        storageMethod.addSync(DEVICE_ID_KEY, deviceId);
        !AssetUtil.canIUse() && LogUtil.error('当前设备不支持关键资产存储服务');
      }
      DeviceUtil.deviceId = deviceId;
    }
    return DeviceUtil.deviceId;
  }

  /**
   * 移除设备ID。
   */
  static deleteDeviceId(): void {
    DeviceUtil.deviceId = '';

    // 使用定义的接口类型
    const storageMethod: StorageMethodForRemove = AssetUtil.canIUse()
      ? AssetUtil
      : PreferencesUtil;

    storageMethod.removeSync(DEVICE_ID_KEY);
  }

  /**
   * 获取设备品牌名称。示例:HUAWEI。
   */
  static getBrand(): string {
    return deviceInfo.brand;
  }

  /**
   * 获取认证型号。示例:ALN-AL00。
   */
  static getProductModel(): string {
    return deviceInfo.productModel;
  }

  /**
   * 获取品牌和型号组合。示例:HUAWEI ALN-AL00。
   */
  static getBrandModel(): string {
    return `${deviceInfo.brand} ${deviceInfo.productModel}`;
  }

  /**
   * 获取市场名称。示例:HUAWEI Mate 60 Pro。
   */
  static getMarketName(): string {
    return deviceInfo.marketName;
  }

  /**
   * 获取硬件版本号。示例:HL1CMSM。
   */
  static getHardwareModel(): string {
    return deviceInfo.hardwareModel;
  }

  /**
   * 获取设备厂家名称。示例:HUAWEI。
   */
  static getManufacture(): string {
    return deviceInfo.manufacture;
  }

  /**
   * 获取系统版本。示例:HarmonyOS 5.0.0。
   */
  static getOsFullName(): string {
    return deviceInfo.osFullName;
  }

  /**
   * 获取产品版本。示例:ALN-AL00 5.0.0.1(XXX)。
   */
  static getDisplayVersion(): string {
    return deviceInfo.displayVersion;
  }

  /**
   * 获取系统软件API版本。示例:12。
   */
  static getSdkApiVersion(): number {
    return deviceInfo.sdkApiVersion;
  }

  /**
   * 获取编译构建的版本号。
   */
  static getBuildVersion(): number {
    return deviceInfo.buildVersion;
  }

  /**
   * 获取OS版本号。示例:5.0.0。
   */
  static getOsVersion(): string {
    return `${deviceInfo.majorVersion}.${deviceInfo.seniorVersion}.${deviceInfo.featureVersion}`;
  }

  /**
   * 获取开发者匿名设备标识符。
   */
  static getODID(): string {
    return deviceInfo.ODID;
  }

  /**
   * 获取设备序列号。需要权限:ohos.permission.sec.ACCESS_UDID。
   */
  static getSerial(): string {
    return deviceInfo.serial;
  }

  /**
   * 获取设备UDID。需要权限:ohos.permission.sec.ACCESS_UDID。
   */
  static getUdid(): string {
    return deviceInfo.udid;
  }

  /**
   * 获取开放匿名设备标识符。需要权限:ohos.permission.APP_TRACKING_CONSENT。
   */
  static async getOAID(): Promise<string> {
    return identifier.getOAID();
  }

  /**
   * 获取应用二进制接口(Abi)。示例:arm64-v8a。
   */
  static getAbiList(): string {
    return deviceInfo.abiList;
  }

  /**
   * 获取系统的发布类型。取值为:Canary、Beta、Release。
   */
  static getOsReleaseType(): string {
    return deviceInfo.osReleaseType;
  }

  /**
   * 获取当前设备类型编号。
   */
  static getDeviceType(): number {
    return DeviceUtil.getDeviceCapabilitySync().deviceType;
  }

  /**
   * 获取当前设备类型的字符串描述。
   */
  static getDeviceTypeStr(): string {
    switch (DeviceUtil.getDeviceType()) {
      case DeviceType.DEVICE_TYPE_PHONE:
        return '手机';
      case DeviceType.DEVICE_TYPE_TABLET:
        return '平板';
      case DeviceType.DEVICE_TYPE_PC:
        return '电脑';
      case DeviceType.DEVICE_TYPE_TV:
        return '电视';
      case DeviceType.DEVICE_TYPE_CAR:
        return '汽车';
      case DeviceType.DEVICE_TYPE_WEARABLE:
        return '穿戴';
      case DeviceType.DEVICE_TYPE_2IN1:
        return '2IN1';
      default:
        return '';
    }
  }

  /**
   * 获取设备的Configuration(异步)。
   */
  static async getConfiguration(): Promise<resourceManager.Configuration> {
    return ResUtil.getConfiguration(true);
  }

  /**
   * 获取设备的Configuration(同步)。
   */
  static getConfigurationSync(): resourceManager.Configuration {
    return ResUtil.getConfigurationSync();
  }

  /**
   * 获取当前设备屏幕方向。
   */
  static getDirection(): Direction {
    return DeviceUtil.getConfigurationSync().direction;
  }

  /**
   * 获取设备的DeviceCapability(异步)。
   */
  static async getDeviceCapability(): Promise<resourceManager.DeviceCapability> {
    return ResUtil.getDeviceCapability(true);
  }

  /**
   * 获取设备的DeviceCapability(同步)。
   */
  static getDeviceCapabilitySync(): resourceManager.DeviceCapability {
    return ResUtil.getDeviceCapabilitySync();
  }

  /**
   * 获取当前设备屏幕密度。
   */
  static getScreenDensity(): ScreenDensity {
    return DeviceUtil.getDeviceCapabilitySync().screenDensity;
  }

  /**
   * 开启振动。
   * 需要权限:ohos.permission.VIBRATE。
   *
   * @param duration 振动时长(毫秒),默认为 1000ms。
   * @param usage 振动用途,默认为 'media'。
   */
  static startVibration(duration: number = 1000, usage: vibrator.Usage = 'media'): Promise<void> {
    return vibrator.startVibration({ type: 'time', duration }, { id: 0, usage });
  }

  /**
   * 停止振动。
   * 需要权限:ohos.permission.VIBRATE。
   */
  static stopVibration(): Promise<void> {
    return vibrator.stopVibration(VibratorStopMode.VIBRATOR_STOP_MODE_TIME);
  }
}

代码如下:

TypeScript 复制代码
import { vibrator, VibratorStopMode } from '@kit.SensorServiceKit';
import { LogUtil } from './LogUtil';
import { resourceManager, DeviceType, Direction, ScreenDensity } from '@kit.LocalizationKit';
import { StrUtil } from './StrUtil';
import { AssetUtil } from './AssetUtil';
import { PreferencesUtil } from './PreferencesUtil';
import { RandomUtil } from './RandomUtil';
import deviceInfo from '@ohos.deviceInfo';
import { ResUtil } from './ResUtil';
import { identifier } from '@kit.AdsKit';
export const DEVICE_ID_KEY: string = "device_id_cache_harmony_key"; //设备ID的Key
/**
 * 定义移除操作的存储方法接口
 */
interface StorageMethodForRemove {
  removeSync: (key: string) => void;
}

/**
 * 定义获取和添加操作的存储方法接口
 */
interface StorageMethodForGetAdd {
  getSync: (key: string) => string | null;
  addSync: (key: string, value: string) => void;
}

/**
 * 设备相关工具类。
 * 提供设备信息、配置、能力、振动等功能的访问。
 *
 * @author 鸿蒙布道师
 * @since 2025/04/09
 */
export class DeviceUtil {
  private static deviceId: string = ''; // 设备ID
  /**
   * 获取设备ID(卸载APP后依旧不变)。
   * 如果未生成过设备ID,则会自动生成并存储。
   *
   * @param rule 是否包含 `-`,默认为 true。
   * @param generateId 自定义生成的ID(可选)。
   * @returns 返回设备ID。
   */
  static getDeviceId(rule: boolean = true, generateId?: string): string {
    if (StrUtil.isEmpty(DeviceUtil.deviceId)) {
      // 使用定义的接口类型
      const storageMethod: StorageMethodForGetAdd = AssetUtil.canIUse()
        ? AssetUtil
        : PreferencesUtil;

      const storedId: string | null = storageMethod.getSync(DEVICE_ID_KEY);
      let deviceId: string = StrUtil.toStr(storedId);

      if (StrUtil.isEmpty(deviceId)) {
        deviceId = generateId && StrUtil.isNotEmpty(generateId)
          ? generateId
          : RandomUtil.generateRandomUUID(true);

        if (!rule) {
          deviceId = deviceId.replace(/-/g, '');
        }

        storageMethod.addSync(DEVICE_ID_KEY, deviceId);
        !AssetUtil.canIUse() && LogUtil.error('当前设备不支持关键资产存储服务');
      }
      DeviceUtil.deviceId = deviceId;
    }
    return DeviceUtil.deviceId;
  }

  /**
   * 移除设备ID。
   */
  static deleteDeviceId(): void {
    DeviceUtil.deviceId = '';

    // 使用定义的接口类型
    const storageMethod: StorageMethodForRemove = AssetUtil.canIUse()
      ? AssetUtil
      : PreferencesUtil;

    storageMethod.removeSync(DEVICE_ID_KEY);
  }

  /**
   * 获取设备品牌名称。示例:HUAWEI。
   */
  static getBrand(): string {
    return deviceInfo.brand;
  }

  /**
   * 获取认证型号。示例:ALN-AL00。
   */
  static getProductModel(): string {
    return deviceInfo.productModel;
  }

  /**
   * 获取品牌和型号组合。示例:HUAWEI ALN-AL00。
   */
  static getBrandModel(): string {
    return `${deviceInfo.brand} ${deviceInfo.productModel}`;
  }

  /**
   * 获取市场名称。示例:HUAWEI Mate 60 Pro。
   */
  static getMarketName(): string {
    return deviceInfo.marketName;
  }

  /**
   * 获取硬件版本号。示例:HL1CMSM。
   */
  static getHardwareModel(): string {
    return deviceInfo.hardwareModel;
  }

  /**
   * 获取设备厂家名称。示例:HUAWEI。
   */
  static getManufacture(): string {
    return deviceInfo.manufacture;
  }

  /**
   * 获取系统版本。示例:HarmonyOS 5.0.0。
   */
  static getOsFullName(): string {
    return deviceInfo.osFullName;
  }

  /**
   * 获取产品版本。示例:ALN-AL00 5.0.0.1(XXX)。
   */
  static getDisplayVersion(): string {
    return deviceInfo.displayVersion;
  }

  /**
   * 获取系统软件API版本。示例:12。
   */
  static getSdkApiVersion(): number {
    return deviceInfo.sdkApiVersion;
  }

  /**
   * 获取编译构建的版本号。
   */
  static getBuildVersion(): number {
    return deviceInfo.buildVersion;
  }

  /**
   * 获取OS版本号。示例:5.0.0。
   */
  static getOsVersion(): string {
    return `${deviceInfo.majorVersion}.${deviceInfo.seniorVersion}.${deviceInfo.featureVersion}`;
  }

  /**
   * 获取开发者匿名设备标识符。
   */
  static getODID(): string {
    return deviceInfo.ODID;
  }

  /**
   * 获取设备序列号。需要权限:ohos.permission.sec.ACCESS_UDID。
   */
  static getSerial(): string {
    return deviceInfo.serial;
  }

  /**
   * 获取设备UDID。需要权限:ohos.permission.sec.ACCESS_UDID。
   */
  static getUdid(): string {
    return deviceInfo.udid;
  }

  /**
   * 获取开放匿名设备标识符。需要权限:ohos.permission.APP_TRACKING_CONSENT。
   */
  static async getOAID(): Promise<string> {
    return identifier.getOAID();
  }

  /**
   * 获取应用二进制接口(Abi)。示例:arm64-v8a。
   */
  static getAbiList(): string {
    return deviceInfo.abiList;
  }

  /**
   * 获取系统的发布类型。取值为:Canary、Beta、Release。
   */
  static getOsReleaseType(): string {
    return deviceInfo.osReleaseType;
  }

  /**
   * 获取当前设备类型编号。
   */
  static getDeviceType(): number {
    return DeviceUtil.getDeviceCapabilitySync().deviceType;
  }

  /**
   * 获取当前设备类型的字符串描述。
   */
  static getDeviceTypeStr(): string {
    switch (DeviceUtil.getDeviceType()) {
      case DeviceType.DEVICE_TYPE_PHONE:
        return '手机';
      case DeviceType.DEVICE_TYPE_TABLET:
        return '平板';
      case DeviceType.DEVICE_TYPE_PC:
        return '电脑';
      case DeviceType.DEVICE_TYPE_TV:
        return '电视';
      case DeviceType.DEVICE_TYPE_CAR:
        return '汽车';
      case DeviceType.DEVICE_TYPE_WEARABLE:
        return '穿戴';
      case DeviceType.DEVICE_TYPE_2IN1:
        return '2IN1';
      default:
        return '';
    }
  }

  /**
   * 获取设备的Configuration(异步)。
   */
  static async getConfiguration(): Promise<resourceManager.Configuration> {
    return ResUtil.getConfiguration(true);
  }

  /**
   * 获取设备的Configuration(同步)。
   */
  static getConfigurationSync(): resourceManager.Configuration {
    return ResUtil.getConfigurationSync();
  }

  /**
   * 获取当前设备屏幕方向。
   */
  static getDirection(): Direction {
    return DeviceUtil.getConfigurationSync().direction;
  }

  /**
   * 获取设备的DeviceCapability(异步)。
   */
  static async getDeviceCapability(): Promise<resourceManager.DeviceCapability> {
    return ResUtil.getDeviceCapability(true);
  }

  /**
   * 获取设备的DeviceCapability(同步)。
   */
  static getDeviceCapabilitySync(): resourceManager.DeviceCapability {
    return ResUtil.getDeviceCapabilitySync();
  }

  /**
   * 获取当前设备屏幕密度。
   */
  static getScreenDensity(): ScreenDensity {
    return DeviceUtil.getDeviceCapabilitySync().screenDensity;
  }

  /**
   * 开启振动。
   * 需要权限:ohos.permission.VIBRATE。
   *
   * @param duration 振动时长(毫秒),默认为 1000ms。
   * @param usage 振动用途,默认为 'media'。
   */
  static startVibration(duration: number = 1000, usage: vibrator.Usage = 'media'): Promise<void> {
    return vibrator.startVibration({ type: 'time', duration }, { id: 0, usage });
  }

  /**
   * 停止振动。
   * 需要权限:ohos.permission.VIBRATE。
   */
  static stopVibration(): Promise<void> {
    return vibrator.stopVibration(VibratorStopMode.VIBRATOR_STOP_MODE_TIME);
  }
}
相关推荐
??? Meggie28 分钟前
【SQL】使用UPDATE修改表字段的时候,遇到1054 或者1064的问题怎么办?
android·数据库·sql
用户20187928316730 分钟前
代码共享法宝之maven-publish
android
山水域31 分钟前
GoogleAdsOnDeviceConversion 库的作用与用法
ios
yjm33 分钟前
从一例 Lottie OOM 线上事故读源码
android·app
Lucifer晓33 分钟前
记录一次Flutter项目上传App Store Connect出现“Validation failed”错误的问题
flutter·ios
用户20187928316740 分钟前
浅谈View的滑动
android
Keya2 小时前
在HarmonyOS(鸿蒙)中H5页面中的视频不会自动播放
app·harmonyos·arkts
二二孚日2 小时前
自用华为ICT云赛道AI第一章知识点-机器学习的常见算法
人工智能·华为
用户2018792831672 小时前
舞台剧兼职演员Dialog
android
参宿四南河三2 小时前
从Android实际应用场景出发,讲述RxJava3的简单使用
android·rxjava