HarmonyOS 设备能力与传感器调用
本文介绍了HarmonyOS应用开发中设备硬件能力的使用方法,重点讲解了传感器订阅和振动功能。主要内容包括:加速度计、陀螺仪、光线传感器等设备的订阅与取消机制,强调生命周期管理和权限申请;振动功能的使用方式,包括单次振动、预设振动模式及停止振动;还简要概述了地理位置、相机、蓝牙等其他设备能力的使用原则。文章强调合理使用硬件功能,注意资源释放和权限管理,避免耗电和隐私问题。

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!
前言
HarmonyOS 应用若要使用设备硬件能力,如加速度计、陀螺仪、光线传感器、振动等,需要调用对应的系统 API。这些能力通常由 @ohos.sensor、@ohos.vibrator 等模块提供,使用时要注意权限、生命周期(订阅与取消订阅),避免耗电和泄漏。
本文只讲传感器订阅、振动、以及调用时的关键注意点,不贴完整 Demo。
传感器概述
常见传感器类型包括:加速度(accelerometer)、陀螺仪(gyroscope)、光线(light)、 proximity 等。使用方式一般是:创建监听回调 → 订阅指定传感器 → 在回调中处理数据 → 页面或应用不可见时取消订阅。
加速度计订阅与取消
import sensor from '@ohos.sensor'
import { BusinessError } from '@kit.BasicServicesKit'
// 保存订阅句柄,用于取消
private accelerometerId: number = -1
// 订阅
sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) => {
// data.x, data.y, data.z 为三轴加速度,单位一般为 m/s²
console.info(`x: ${data.x}, y: ${data.y}, z: ${data.z}`)
}, { interval: 200000000 }) // 纳秒,200ms 采样一次
// 若 API 返回 subscriptionId,需保存
// this.accelerometerId = id
取消订阅(在 aboutToDisappear 或页面不可见时):
sensor.off(sensor.SensorId.ACCELEROMETER)
// 若使用 subscriptionId:sensor.off(sensor.SensorId.ACCELEROMETER, this.accelerometerId)
要点:
- interval:采样间隔,单位多为纳秒(1 秒 = 1_000_000_000 纳秒),不宜过小,否则耗电明显。
- 生命周期:必须在页面销毁或不再需要时
off,否则会一直耗电并可能造成回调异常。
陀螺仪与光线传感器
用法类似,仅 SensorId 和回调数据类型不同:
// 陀螺仪
sensor.on(sensor.SensorId.GYROSCOPE, (data: sensor.GyroscopeResponse) => {
// data.x, data.y, data.z 角速度
}, { interval: 200000000 })
// 光线
sensor.on(sensor.SensorId.LIGHT, (data: sensor.LightResponse) => {
// data.intensity 光照强度
}, { interval: 1000000000 })
同样在适当时机调用 sensor.off(sensor.SensorId.XXX) 取消订阅。
权限
部分传感器可能需要在 module.json5 中声明权限,并在运行期申请。具体权限名以当前文档为准,例如:
"requestPermissions": [
{ "name": "ohos.permission.ACCELEROMETER", "reason": "用于摇一摇等功能" }
]
若未声明或用户拒绝,on() 可能失败,需在回调或 catch 中处理。
振动
振动用于触觉反馈,如按钮点击、提醒。通过 @ohos.vibrator 触发。
单次振动
import vibrator from '@ohos.vibrator'
vibrator.startVibration(
{ type: 'time', duration: 100 },
{ usage: 'touch' },
(err: BusinessError) => {
if (err) {
console.error('startVibration failed', err)
}
}
)
- duration:毫秒
- usage:如
touch、notification等,影响系统对振动的策略(如勿扰时是否静音)
预定义振动曲线
部分设备支持预定义曲线(如「轻触」「中等」),可用 type: 'preset' 配合 presetId:
vibrator.startVibration(
{ type: 'preset', presetId: 1 },
{ usage: 'touch' },
(err: BusinessError) => { /* ... */ }
)
具体 presetId 与设备支持情况以文档为准。
停止振动
若振动是长时长或循环,可在需要时停止:
vibrator.stopVibration((err: BusinessError) => {
if (err) {
console.error('stopVibration failed', err)
}
})
其他设备能力简述
- 地理位置:使用
@ohos.geoLocationManager,需声明位置权限并在运行时申请,注意隐私说明。 - 相机/相册:使用
@ohos.multimedia.camera、@ohos.file.picker等,需相应权限。 - 蓝牙:使用
@ohos.bluetooth相关 API,需声明蓝牙权限。
这些模块的「打开/申请 → 使用 → 关闭/释放」模式与传感器类似:在合适的生命周期内完成申请与释放,避免权限拒绝或资源泄漏。
总结
- 传感器:
sensor.on(SensorId, callback, options)订阅,sensor.off(SensorId)取消;注意 interval 不要过小,并在页面/组件销毁时取消。 - 振动:
vibrator.startVibration触发,按需stopVibration;注意 duration、usage 和权限。 - 其他能力:遵循「权限声明 + 运行期申请」「使用完释放」的原则,具体以各模块文档为准。
设备能力用得好可以增强体验,用不好会带来耗电、隐私和审核问题,建议按需订阅、及时释放。
更多推荐



所有评论(0)