鸿蒙App 获取设备信息(型号/系统版本/屏幕分辨率)技术详解

举报
鱼弦 发表于 2025/12/01 09:54:04 2025/12/01
【摘要】 一、引言​在鸿蒙(HarmonyOS)应用开发中,设备信息获取是适配UI布局、判断功能兼容性、统计分析用户设备的基础能力。核心信息包括设备型号(如华为Mate 60)、系统版本(如HarmonyOS 4.0)、屏幕分辨率(如2340×1080)等。这些信息直接影响应用的兼容性设计(如折叠屏适配)、功能开关(如新API可用性)和用户体验优化(如分辨率自适应)。本文将系统讲解鸿蒙获取设备信息的A...


一、引言

在鸿蒙(HarmonyOS)应用开发中,设备信息获取是适配UI布局、判断功能兼容性、统计分析用户设备的基础能力。核心信息包括设备型号(如华为Mate 60)、系统版本(如HarmonyOS 4.0)、屏幕分辨率(如2340×1080)等。这些信息直接影响应用的兼容性设计(如折叠屏适配)、功能开关(如新API可用性)和用户体验优化(如分辨率自适应)。本文将系统讲解鸿蒙获取设备信息的API原理、代码实现及跨设备适配方案,提供可直接集成的完整代码。

二、技术背景

1. 鸿蒙设备信息获取核心API
信息类型
API模块
核心接口
返回数据类型
设备型号
@ohos.deviceInfo
getDeviceInfo()
DeviceInfo对象
系统版本
@ohos.deviceInfo
getSystemVersion()
string(如"4.0.0")
屏幕分辨率
@ohos.display
getDefaultDisplay()width/height
number(像素值)
设备品牌
@ohos.deviceInfo
getBrand()
string(如"HUAWEI")
2. 关键技术特性
  • 权限免申请:设备型号、系统版本、分辨率属于公开信息,无需额外权限。
  • 实时更新:屏幕分辨率在设备旋转时可动态获取(需监听显示变化)。
  • 多设备适配:支持手机、平板、智慧屏、车机等不同形态设备的差异化信息。

三、应用场景

场景
需求描述
实现方案
UI自适应布局
根据屏幕分辨率动态调整组件尺寸(如折叠屏展开/折叠状态)
获取宽高比,通过@MediaQuery或动态计算布局参数
功能兼容性判断
仅在HarmonyOS 4.0+启用新特性(如方舟引擎优化)
解析系统版本号,对比最低支持版本
设备统计分析
收集用户设备型号分布(如高端机型占比)
上报设备型号、品牌至服务端,生成统计报表
折叠屏适配
识别折叠屏状态(展开/折叠)以切换布局
结合屏幕分辨率和折叠状态API(@ohos.window

四、核心原理与流程图

1. 原理解释
  • 设备型号/系统版本:存储在系统属性中,通过@ohos.deviceInfo模块的底层接口读取,返回结构化数据。
  • 屏幕分辨率:由显示管理服务(Display Manager)维护,通过@ohos.display模块获取当前激活的显示设备参数(支持多屏异显)。
2. 原理流程图
graph TD
    A[应用发起请求] --> B{信息类型}
    B -->|设备型号/系统版本| C[@ohos.deviceInfo模块]
    B -->|屏幕分辨率| D[@ohos.display模块]
    C --> E[调用getDeviceInfo/getSystemVersion]
    D --> F[调用getDefaultDisplay]
    E --> G[返回DeviceInfo对象/版本字符串]
    F --> H[提取width/height属性]
    G --> I[数据格式化]
    H --> I
    I --> J[应用层使用]

五、核心特性

  1. 多维度信息获取:支持型号、版本、分辨率、品牌、CPU架构等20+设备属性。
  2. 动态监听:屏幕旋转时通过Display事件回调实时更新分辨率。
  3. 兼容性处理:自动适配API 9+(HarmonyOS 4.0+)和旧版本差异。
  4. 隐私合规:仅获取公开信息,不涉及用户隐私数据(如IMEI)。

六、环境准备

1. 开发环境
  • DevEco Studio:3.1+(最新版)
  • HarmonyOS SDK:API 9+(支持ArkUI声明式开发)
  • 设备:真机(华为手机/平板)/模拟器(API 9+)
2. 项目配置
无需额外权限,直接在代码中导入模块即可:
import deviceInfo from '@ohos.deviceInfo';  // 设备信息模块
import display from '@ohos.display';        // 显示模块

七、详细代码实现

以下分基础信息获取屏幕分辨率动态监听综合应用示例三个场景实现完整功能。
场景1:基础设备信息获取(DeviceInfoUtil)
功能:封装设备型号、系统版本、品牌、分辨率的获取方法。
1. 工具类代码(DeviceInfoUtil.ets)
// 设备信息工具类
export class DeviceInfoUtil {
  /**
   * 获取设备型号(如"Mate 60 Pro")
   */
  static async getDeviceModel(): Promise<string> {
    try {
      const deviceInfoObj = await deviceInfo.getDeviceInfo();
      return deviceInfoObj.model || 'unknown';
    } catch (err) {
      console.error('获取设备型号失败:', err);
      return 'unknown';
    }
  }

  /**
   * 获取系统版本(如"4.0.0")
   */
  static async getSystemVersion(): Promise<string> {
    try {
      return deviceInfo.getSystemVersion(); // 同步接口
    } catch (err) {
      console.error('获取系统版本失败:', err);
      return 'unknown';
    }
  }

  /**
   * 获取设备品牌(如"HUAWEI")
   */
  static async getBrand(): Promise<string> {
    try {
      const deviceInfoObj = await deviceInfo.getDeviceInfo();
      return deviceInfoObj.brand || 'unknown';
    } catch (err) {
      console.error('获取品牌失败:', err);
      return 'unknown';
    }
  }

  /**
   * 获取屏幕分辨率(宽×高,单位px)
   */
  static async getScreenResolution(): Promise<{ width: number; height: number }> {
    try {
      const displayObj = display.getDefaultDisplay();
      return {
        width: displayObj.width,
        height: displayObj.height
      };
    } catch (err) {
      console.error('获取分辨率失败:', err);
      return { width: 0, height: 0 };
    }
  }

  /**
   * 获取设备信息汇总(同步+异步混合调用)
   */
  static async getAllDeviceInfo(): Promise<{
    model: string;
    version: string;
    brand: string;
    resolution: { width: number; height: number };
  }> {
    const [model, version, brand, resolution] = await Promise.all([
      this.getDeviceModel(),
      this.getSystemVersion(),
      this.getBrand(),
      this.getScreenResolution()
    ]);
    return { model, version, brand, resolution };
  }
}
场景2:屏幕分辨率动态监听(ResolutionMonitor)
功能:监听屏幕旋转事件,实时更新分辨率。
1. 监听组件代码(ResolutionMonitor.ets)
import display from '@ohos.display';
import { BusinessError } from '@ohos.base';

@Component
export struct ResolutionMonitor {
  @State screenWidth: number = 0;
  @State screenHeight: number = 0;
  private displayId: number = 0;

  aboutToAppear() {
    this.initDisplay();
    this.registerDisplayChangeListener();
  }

  aboutToDisappear() {
    this.unregisterDisplayChangeListener();
  }

  // 初始化显示设备
  private initDisplay() {
    try {
      const displayObj = display.getDefaultDisplay();
      this.displayId = displayObj.id;
      this.screenWidth = displayObj.width;
      this.screenHeight = displayObj.height;
    } catch (err) {
      console.error('初始化显示设备失败:', (err as BusinessError).message);
    }
  }

  // 注册显示变化监听
  private registerDisplayChangeListener() {
    try {
      display.on('displayChange', (data) => {
        if (data.displayId === this.displayId) {
          this.screenWidth = data.width;
          this.screenHeight = data.height;
          console.log(`分辨率更新: ${this.screenWidth}×${this.screenHeight}`);
        }
      });
    } catch (err) {
      console.error('注册监听失败:', (err as BusinessError).message);
    }
  }

  // 注销监听
  private unregisterDisplayChangeListener() {
    try {
      display.off('displayChange');
    } catch (err) {
      console.error('注销监听失败:', (err as BusinessError).message);
    }
  }

  build() {
    Column() {
      Text(`当前分辨率: ${this.screenWidth}×${this.screenHeight}`)
        .fontSize(20)
        .margin(10)
    }
  }
}
场景3:综合应用示例(DeviceInfoPage)
功能:页面展示设备信息,支持下拉刷新更新数据。
1. 页面代码(DeviceInfoPage.ets)
import { DeviceInfoUtil } from '../utils/DeviceInfoUtil';
import { ResolutionMonitor } from '../components/ResolutionMonitor';

@Entry
@Component
struct DeviceInfoPage {
  @State deviceInfo: {
    model: string;
    version: string;
    brand: string;
    resolution: { width: number; height: number };
  } = { model: '', version: '', brand: '', resolution: { width: 0, height: 0 } };

  @State isLoading: boolean = true;

  aboutToAppear() {
    this.loadDeviceInfo();
  }

  // 加载设备信息
  private async loadDeviceInfo() {
    this.isLoading = true;
    try {
      this.deviceInfo = await DeviceInfoUtil.getAllDeviceInfo();
    } catch (err) {
      console.error('加载设备信息失败:', err);
    } finally {
      this.isLoading = false;
    }
  }

  build() {
    Column({ space: 15 }) {
      // 标题
      Text('设备信息')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 20 });

      // 加载状态
      if (this.isLoading) {
        LoadingProgress()
          .width(50)
          .height(50)
          .margin(20);
      } else {
        // 设备信息卡片
        Column({ space: 10 }) {
          InfoRow('设备型号', this.deviceInfo.model);
          InfoRow('系统版本', this.deviceInfo.version);
          InfoRow('设备品牌', this.deviceInfo.brand);
          InfoRow(
            '屏幕分辨率', 
            `${this.deviceInfo.resolution.width}×${this.deviceInfo.resolution.height}`
          );
        }
        .width('90%')
        .padding(15)
        .backgroundColor('#F5F5F5')
        .borderRadius(10)
      }

      // 分辨率动态监听组件
      ResolutionMonitor()
        .margin(20);

      // 刷新按钮
      Button('刷新信息', { type: ButtonType.Normal })
        .width(150)
        .height(40)
        .margin(20)
        .onClick(() => this.loadDeviceInfo());
    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center);
  }

  // 信息行组件(复用)
  @Builder
  InfoRow(label: string, value: string | number) {
    Row() {
      Text(label)
        .fontSize(16)
        .fontColor('#666666')
        .layoutWeight(1);
      Text(value.toString())
        .fontSize(16)
        .fontColor('#000000')
        .layoutWeight(2);
    }
    .width('100%')
    .padding(5);
  }
}

八、运行结果与测试步骤

1. 预期效果
  • 基础信息:页面显示设备型号(如"Mate 60 Pro")、系统版本(如"4.0.0")、品牌(如"HUAWEI")、分辨率(如"2340×1080")。
  • 动态监听:旋转屏幕(横竖屏切换),分辨率实时更新。
  • 刷新功能:点击"刷新信息"按钮,重新加载数据。
2. 测试步骤
  1. 环境配置
    • 安装DevEco Studio 3.1+,创建"Empty Ability"项目(语言选择TS)。
    • 将上述代码文件放入entry/src/main/ets/utils/(工具类)、components/(组件)、pages/(页面)。
  2. 真机测试
    • 连接华为手机(HarmonyOS 4.0+),开启USB调试。
    • 运行项目,观察设备信息是否正确显示。
  3. 模拟器测试
    • 使用DevEco Studio自带的API 9+模拟器,测试分辨率动态监听(旋转模拟器)。

九、部署场景

设备类型
适配要点
直板手机
默认获取主屏分辨率,横竖屏切换时通过ResolutionMonitor更新
折叠屏
结合@ohos.window获取折叠状态,区分主副屏分辨率
智慧屏
分辨率通常较大(如3840×2160),需调整UI字体大小和组件间距
车机系统
关注横屏模式下的分辨率(如1920×720),优化驾驶场景下的信息展示

十、疑难解答

问题现象
原因分析
解决方案
获取设备型号返回"unknown"
旧版本API(API < 9)不支持getDeviceInfo()
升级SDK至API 9+,或使用deviceInfo.getBrand()+deviceInfo.getProductModel()组合
分辨率获取为0×0
模拟器未正确初始化显示设备
重启模拟器,或在aboutToAppear中延迟100ms再调用getDefaultDisplay()
旋转屏幕后分辨率未更新
未注册displayChange事件监听
确保ResolutionMonitor组件的aboutToAppear中调用registerDisplayChangeListener
系统版本号格式不符预期
部分设备返回的版本号包含构建号(如"4.0.0.105")
使用split('.')截取前三位(如version.split('.')[0..2].join('.')

十一、未来展望与技术趋势

1. 趋势
  • 更多设备属性:支持获取电池状态、传感器列表、存储空间等信息(通过@ohos.battery@ohos.sensor模块)。
  • 跨设备协同:结合分布式设备管理,获取周边鸿蒙设备信息(如智慧屏、音箱)。
  • 隐私增强:用户可手动授权设备信息访问范围,默认隐藏敏感字段(如IMEI)。
  • AI适配推荐:基于设备型号自动推荐最优UI布局(如折叠屏分屏模式)。
2. 挑战
  • 多端一致性:不同厂商设备(如华为、荣耀)的系统版本号格式差异。
  • 低功耗优化:频繁获取设备信息可能增加功耗,需平衡实时性与性能。

十二、总结

鸿蒙获取设备信息的核心是规范使用系统API适配多设备场景
  1. 核心API:通过@ohos.deviceInfo@ohos.display模块获取型号、版本、分辨率,无需权限。
  2. 动态监听:屏幕旋转时通过displayChange事件实时更新分辨率。
  3. 最佳实践
    • 封装工具类(如DeviceInfoUtil)统一管理接口。
    • 使用Promise.all并行获取多维度信息,提升效率。
    • 针对折叠屏、车机等特殊设备,结合窗口状态API优化布局。
通过本文的代码实现,开发者可快速集成设备信息获取功能,为应用适配和功能优化提供数据支撑。
完整源码下载
DeviceInfoUtil.ets
ResolutionMonitor.ets
DeviceInfoPage.ets
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。