在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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:如 touchnotification 等,影响系统对振动的策略(如勿扰时是否静音)

预定义振动曲线

部分设备支持预定义曲线(如「轻触」「中等」),可用 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 和权限。
  • 其他能力:遵循「权限声明 + 运行期申请」「使用完释放」的原则,具体以各模块文档为准。

设备能力用得好可以增强体验,用不好会带来耗电、隐私和审核问题,建议按需订阅、及时释放。

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐