首页 鸿蒙 正文
  • 本文约3100字,阅读需16分钟
  • 74
  • 0

解读鸿蒙开发中手机硬件传感器开发问题的关键

温馨提示:本文最后更新于2024年10月18日 07:54,若内容或图片失效,请在下方留言或联系博主。

系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口,可以查询设备上的传感器,订阅传感器数据,并根据传感器数据定制相应的算法开发各类应用,比如指南针、运动健康、游戏等。

1. 添加传感器权限(module.json5):

{
”name“:”ohos.permission.ACCELEROMETER“
}

2. 启动/关闭传感器-加速度:

 // 启动 持续监听传感器数据变化(on 持续监听 once 监听一次)
  startSensor() {
    // sensor.on 打开传感器检测 ACCELEROMETER 加速度传感器(模拟器支持(摇一摇))
    sensor.on(sensor.SensorId.ACCELEROMETER, (response) => {
      this.sensorResponse = response // 保存传感器数据
    })
  }

  // 关闭 持久监听传感器数据变化
  stopSensor() {
    // sensor.off 关闭传感器检测
    sensor.off(sensor.SensorId.ACCELEROMETER)
  }

3. 启动/关闭传感器-磁场:

// 启动 磁场传感器监测
  startSensor() {
    // 由于模拟器不支持 会报错闪退(使用请求拦截器不会闪退)
    try {
      // sensor.on 打开传感器检测 MAGNETIC_FIELD 磁场传感器(模拟器不支持)
      sensor.on(sensor.SensorId.MAGNETIC_FIELD, (response) => {
        // 保存传感器返回数据
        this.sensorResponse = response
        // 触发频率 interval:'game' > 'ui' > 'normal'
      }, { interval: 'ui' })
    } catch (err) {
      AlertDialog.show({ message: JSON.stringify('硬件设备暂不支持', null, 2) })
    }
  }

  // 关闭 磁场传感器数据变化
  stopSensor() {
    try {
      // sensor.off 关闭传感器检测
      sensor.off(sensor.SensorId.MAGNETIC_FIELD)
    } catch (err) {
    }
  }

4. 启动/关闭传感器-马达震动:

应用场景:

  1. 通知和提醒:当有新消息、提醒或通知时,通过震动提醒用户。例如,微信、短信、社交媒体通知等。
  2. 错误或警告:当用户进行的操作出现错误或需要特别注意时,使用震动来提示用户。例如,输入错误密码、操作失败等。
  3. 交互反馈:在用户与应用互动时提供即时反馈。例如,按钮点击、滑动操作、长按、下拉刷新等。
  4. 游戏和娱乐:在游戏中,通过震动来模拟游戏内的事件或动作,例如碰撞、爆炸等,增强游戏体验。
  5. 闹钟和计时器:当闹钟或计时器到点时,通过震动提醒用户。
// 申请马达震动权限
{ // 马达震动
        "name": "ohos.permission.VIBRATE"
      },
  // 开启 震动马达传感器
  startVibrate() {
    // duration 持续的时长
    vibrator.startVibration({ type: 'time', duration: 500 }, { id: 1, usage: 'alarm' })
  }

  // 关闭 震动马达传感器
  stopVibrate() {
    vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME)
  }

5. 开启/关闭手电筒:

 Button('开闪光灯--手电筒模式')
            .onClick(() => {
              //获取相机管理器 // 初始化 CameraManager
              const cameraManager = camera.getCameraManager(getContext())
              try {
                //  开启手电筒模式
                cameraManager.setTorchMode(camera.TorchMode.ON)
              } catch (err) {
                AlertDialog.show({ message: JSON.stringify('模拟器暂无权限', null, 2) })
              }
            })
Button('关闪光灯--手电筒模式')
            .onClick(() => {
              //获取相机管理器 // 初始化 CameraManager
              const cameraManager = camera.getCameraManager(getContext())
              // .isTorchSupported() 判断某个功能是否支持
              if (cameraManager.isTorchSupported()) {
                //  关闭手电筒模式
                cameraManager.setTorchMode(camera.TorchMode.OFF)
              }
            })
 Button('切换闪光灯效果')
            .onClick(() => {
              //获取相机管理器 // 初始化 CameraManager
              const cameraManager = camera.getCameraManager(getContext())
              if (cameraManager.getTorchMode() == camera.TorchMode.ON) {
                promptAction.showToast({ message: '闪光灯开启中' })
              } else {
                promptAction.showToast({ message: '闪光灯关闭中' })
              }
            })

封装好的一系列代码:

import { camera } from '@kit.CameraKit';

class TorchManager {
  private cameraManager: camera.CameraManager | null = null

  async getCameraManagerInstance() {
    // 如果已存在直接返回
    if (this.cameraManager) {
      return this.cameraManager
    }
    // 初始化 CameraManager
    const cameraManager = camera.getCameraManager(getContext())
    // 检查是否支持
    if (cameraManager.isTorchSupported() === false) {
      return Promise.reject('当前设备不支持闪光灯')
    }
    // 保存并返回
    this.cameraManager = cameraManager
    return this.cameraManager
  }

  // 开启闪光灯
  async openTorch() {
    const cameraManager = await this.getCameraManagerInstance()
    cameraManager.setTorchMode(camera.TorchMode.ON)
  }

  // 关闭闪光灯
  async closeTorch() {
    const cameraManager = await this.getCameraManagerInstance()
    cameraManager.setTorchMode(camera.TorchMode.OFF)
  }

  // 切换闪光灯
  async toggleTorch() {
    const cameraManager = await this.getCameraManagerInstance()
    if (cameraManager.getTorchMode() === camera.TorchMode.OFF) {
      this.openTorch()
    } else {
      this.closeTorch()
    }
  }
}

export const torchManager = new TorchManager()
评论