一、引言
在鸿蒙(HarmonyOS)应用开发中,设备信息获取是适配UI布局、判断功能兼容性、统计分析用户设备的基础能力。核心信息包括设备型号(如华为Mate 60)、系统版本(如HarmonyOS 4.0)、屏幕分辨率(如2340×1080)等。这些信息直接影响应用的兼容性设计(如折叠屏适配)、功能开关(如新API可用性)和用户体验优化(如分辨率自适应)。本文将系统讲解鸿蒙获取设备信息的API原理、代码实现及跨设备适配方案,提供可直接集成的完整代码。
二、技术背景
1. 鸿蒙设备信息获取核心API
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getDefaultDisplay()→ width/height
|
|
|
|
|
|
|
2. 关键技术特性
-
权限免申请:设备型号、系统版本、分辨率属于公开信息,无需额外权限。
-
实时更新:屏幕分辨率在设备旋转时可动态获取(需监听显示变化)。
-
多设备适配:支持手机、平板、智慧屏、车机等不同形态设备的差异化信息。
三、应用场景
|
|
|
|
|
|
根据屏幕分辨率动态调整组件尺寸(如折叠屏展开/折叠状态)
|
获取宽高比,通过@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[应用层使用]
五、核心特性
-
多维度信息获取:支持型号、版本、分辨率、品牌、CPU架构等20+设备属性。
-
动态监听:屏幕旋转时通过
Display事件回调实时更新分辨率。
-
兼容性处理:自动适配API 9+(HarmonyOS 4.0+)和旧版本差异。
-
隐私合规:仅获取公开信息,不涉及用户隐私数据(如IMEI)。
六、环境准备
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. 测试步骤
-
-
安装DevEco Studio 3.1+,创建"Empty Ability"项目(语言选择TS)。
-
将上述代码文件放入
entry/src/main/ets/utils/(工具类)、components/(组件)、pages/(页面)。
-
-
连接华为手机(HarmonyOS 4.0+),开启USB调试。
-
-
-
使用DevEco Studio自带的API 9+模拟器,测试分辨率动态监听(旋转模拟器)。
九、部署场景
|
|
|
|
|
默认获取主屏分辨率,横竖屏切换时通过ResolutionMonitor更新
|
|
|
结合@ohos.window获取折叠状态,区分主副屏分辨率
|
|
|
分辨率通常较大(如3840×2160),需调整UI字体大小和组件间距
|
|
|
关注横屏模式下的分辨率(如1920×720),优化驾驶场景下的信息展示
|
十、疑难解答
|
|
|
|
|
|
旧版本API(API < 9)不支持getDeviceInfo()
|
升级SDK至API 9+,或使用deviceInfo.getBrand()+deviceInfo.getProductModel()组合
|
|
|
|
重启模拟器,或在aboutToAppear中延迟100ms再调用getDefaultDisplay()
|
|
|
|
确保ResolutionMonitor组件的aboutToAppear中调用registerDisplayChangeListener
|
|
|
部分设备返回的版本号包含构建号(如"4.0.0.105")
|
使用split('.')截取前三位(如version.split('.')[0..2].join('.'))
|
十一、未来展望与技术趋势
1. 趋势
-
更多设备属性:支持获取电池状态、传感器列表、存储空间等信息(通过
@ohos.battery、@ohos.sensor模块)。
-
跨设备协同:结合分布式设备管理,获取周边鸿蒙设备信息(如智慧屏、音箱)。
-
隐私增强:用户可手动授权设备信息访问范围,默认隐藏敏感字段(如IMEI)。
-
AI适配推荐:基于设备型号自动推荐最优UI布局(如折叠屏分屏模式)。
2. 挑战
-
多端一致性:不同厂商设备(如华为、荣耀)的系统版本号格式差异。
-
低功耗优化:频繁获取设备信息可能增加功耗,需平衡实时性与性能。
十二、总结
鸿蒙获取设备信息的核心是规范使用系统API与适配多设备场景:
-
核心API:通过
@ohos.deviceInfo和@ohos.display模块获取型号、版本、分辨率,无需权限。
-
动态监听:屏幕旋转时通过
displayChange事件实时更新分辨率。
-
-
封装工具类(如
DeviceInfoUtil)统一管理接口。
-
使用
Promise.all并行获取多维度信息,提升效率。
-
针对折叠屏、车机等特殊设备,结合窗口状态API优化布局。
通过本文的代码实现,开发者可快速集成设备信息获取功能,为应用适配和功能优化提供数据支撑。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)