第26章_HarmonyOs开发图解之 设备管理

第26章 HarmonyOs开发图解之 设备管理

HarmonyOS 学习系统 | 阶段四:专业精通期


学习目标

序号 能力
1 掌握传感器(加速度计、陀螺仪等)的数据订阅
2 能够使用 LightAgent 和 VibratorAgent 控制指示灯和振动器
3 掌握位置服务的使用和系统设置的监听

核心图解

内容讲解

26.1 设备管理概述

HarmonyOS 的设备管理模块涵盖四大方向:传感器(Sensor)、控制类小器件(LED/振动器)、位置服务(Location)和系统设置(Settings)。这些能力让应用能够感知物理世界、控制设备硬件和获取用户位置。

生活化类比:传感器就像"手机的五官"

加速度计是"前庭"(感知倾斜和运动),陀螺仪是"内耳"(感知旋转),环境光传感器是"眼睛对光的感知",温度计是"皮肤对温度的感知"。而位置服务就像"GPS 导航仪"------通过卫星(GNSS)、基站信号(像通过附近基站的"大声喊话"来判断距离)和 WLAN 信号(像闻到附近 Wi-Fi 的"气味"来判断位置)三种方式来确定你在哪。采样率就像"眨眼频率"------采样率越高越灵敏,但也越费电。

26.2 传感器使用

java 复制代码
// 订阅方向传感器数据
SensorAgent sensorAgent = SensorAgent.getSensorAgent();
boolean success = sensorAgent.setSensorDataCallback(
    new SensorDataCallback() {
        @Override
        public void onSensorDataCallback(SensorEvent event) {
            float[] values = event.values;
            HiLog.info(TAG, "X: " + values[0]
                + ", Y: " + values[1]
                + ", Z: " + values[2]);
        }
    },
    SensorAgent.SENSOR_TYPE_ACCELEROMETER, // 加速度计
    SensorAgent.SENSOR_DELAY_NORMAL        // 采样率
);

// 取消订阅(重要!)
sensorAgent.releaseSensorDataCallback(
    callback,
    SensorAgent.SENSOR_TYPE_ACCELEROMETER
);

26.3 控制类小器件

java 复制代码
// LED 指示灯控制
LightAgent lightAgent = new LightAgent(context);
int[] lightIds = lightAgent.getLightIdList();
if (lightIds.length > 0) {
    lightAgent.turnOn(lightIds[0], new LightEffect.Builder()
        .setLightColor(0xFFFF0000) // 红色
        .setBlinkMode(LightEffect.BLINK_MODE_TIMED)
        .setBlinkOnTime(500)
        .setBlinkOffTime(500)
        .build());
    // lightAgent.turnOff(lightIds[0]); // 关闭
}

// 振动器控制
VibratorAgent vibratorAgent = new VibratorAgent(context);
vibratorAgent.vibrate(500); // 振动 500 毫秒

26.4 位置服务

java 复制代码
Locator locator = new Locator(context);

// 单次定位
locator.requestOnce(new LocationRequest(), new MyLocationCallback());

// 持续定位
locator.startLocating(new LocationRequest(), new MyLocationCallback());

// 获取缓存位置(省电方案)
Location cachedLocation = locator.getCachedLocation();

class MyLocationCallback implements LocationCallback {
    @Override
    public void onLocationReport(Location location) {
        HiLog.info(TAG, "纬度: " + location.getLatitude()
            + ", 经度: " + location.getLongitude());
    }
    @Override
    public void onErrorReport(int type) {
        HiLog.error(TAG, "定位错误: " + type);
    }
}

代码速查卡

API 功能 所属模块
setSensorDataCallback(cb, sensor, interval) 订阅传感器数据 方向传感器
releaseSensorDataCallback(cb, sensor) 取消订阅 方向传感器
getLightIdList() 获取灯列表 LightAgent
turnOn(lightId, effect) 打开灯/自定义闪烁 LightAgent
turnOff(lightId) 关闭灯 LightAgent
vibrate(duration) 振动指定时长 VibratorAgent
startLocating(request, callback) 持续定位 Locator
requestOnce(request, callback) 单次定位 Locator
getCachedLocation() 获取缓存位置(省电) Locator

与 Android/iOS 对比

特性 HarmonyOS Android iOS
传感器 SensorAgent + SensorDataCallback SensorManager + SensorEventListener CoreMotion
LED 控制 LightAgent NotificationManager (LED 通知) 不提供公开 API
振动器 VibratorAgent Vibrator UIImpactFeedbackGenerator
定位 Locator FusedLocationProviderClient CLLocationManager
系统设置监听 Settings 注册回调 ContentObserver (Settings) NotificationCenter

⚠️ 踩坑回忆录

为什么定位一直返回错误?

我调用 startLocating() 后,回调里一直收到 onErrorReport。排查了代码逻辑没问题,权限也申请了,最后发现------手机的位置信息开关根本没打开!定位服务需要用户在系统设置中手动开启位置开关,否则系统不会向任何应用提供位置服务。正确做法是先检查位置开关状态,未开启时引导用户去设置页面开启。

传感器还有一个坑:releaseSensorDataCallback 必须在 Ability 的 onStop 中调用,否则传感器会一直工作,迅速耗尽电池。我曾在后台测试时忘记释放加速度计,半小时就耗了 30% 的电。


必做实操任务

序号 任务 难度
1 实现加速度计数据获取并显示 X/Y/Z 值
2 实现摇一摇功能(通过加速度阈值判断)
3 实现 LED 闪烁效果(自定义颜色和频率)
4 实现定位功能并显示经纬度
5 实现一个"计步器"App(通过加速度传感器)

学习检查清单

  • 能使用 SensorAgent 订阅和取消订阅传感器数据
  • 能区分加速度计、陀螺仪、环境光传感器等传感器类型
  • 能使用 LightAgent 控制 LED 指示灯
  • 能使用 VibratorAgent 控制振动器
  • 能使用 Locator 实现定位功能
  • 知道为什么定位需要用户开启系统位置开关
  • 知道为什么传感器必须在 onStop 中释放
  • 能说出 GNSS、基站定位、WLAN 定位的区别

进阶方向

  • 实现一个运动追踪 App(结合加速度计和陀螺仪)
  • 探索传感器数据的滤波和降噪处理
  • 学习地理围栏(Geofencing)功能 知道为什么定位需要用户开启系统位置开关
  • 知道为什么传感器必须在 onStop 中释放
  • 能说出 GNSS、基站定位、WLAN 定位的区别

进阶方向

  • 实现一个运动追踪 App(结合加速度计和陀螺仪)
  • 探索传感器数据的滤波和降噪处理
  • 学习地理围栏(Geofencing)功能
相关推荐
自然 醒1 小时前
v-tooltip自定义指令封装
前端·javascript·vue.js
万敏5 小时前
Vue3 全栈实战第四周:watch、nextTick、性能优化与 keep-alive 实战记录
vue.js·node.js·全栈
布兰妮甜5 小时前
Vue 大型页面性能优化:四个核心策略
vue.js·性能优化·虚拟滚动·组件缓存·按需加载
di24k24k6 小时前
多个 el-form 共用同一 ref 导致表单校验部分失效
前端·javascript·vue.js·elementui
执子念的飞鱼8 小时前
Vue 3 文件预览落地:鉴权 Blob、Worker/WASM 与内网子路径部署
vue.js·webassembly
无人生还8 小时前
从 Vue3 到 React · 快速上手系列第 11 篇:状态管理
前端·vue.js·react.js
其美杰布-富贵-李9 小时前
Vue 3 模块导入教程:import、export 与文件组织
前端·javascript·vue.js
布兰妮甜9 小时前
Vue 路由进阶:路由守卫权限控制、动态路由、懒加载、路由缓存
vue.js·懒加载·动态路由·路由守卫权限控制·路由缓存
Cobyte10 小时前
Vite & Rollup 插件开发实践
前端·javascript·vue.js