第26章_HarmonyOs开发图解之 设备管理
第26章 HarmonyOs开发图解之 设备管理
HarmonyOS 学习系统 | 阶段四:专业精通期
学习目标
| 序号 | 能力 |
|---|---|
| 1 | 掌握传感器(加速度计、陀螺仪等)的数据订阅 |
| 2 | 能够使用 LightAgent 和 VibratorAgent 控制指示灯和振动器 |
| 3 | 掌握位置服务的使用和系统设置的监听 |
核心图解
内容讲解
26.1 设备管理概述
HarmonyOS 的设备管理模块涵盖四大方向:传感器(Sensor)、控制类小器件(LED/振动器)、位置服务(Location)和系统设置(Settings)。这些能力让应用能够感知物理世界、控制设备硬件和获取用户位置。
生活化类比:传感器就像"手机的五官"
加速度计是"前庭"(感知倾斜和运动),陀螺仪是"内耳"(感知旋转),环境光传感器是"眼睛对光的感知",温度计是"皮肤对温度的感知"。而位置服务就像"GPS 导航仪"——通过卫星(GNSS)、基站信号(像通过附近基站的"大声喊话"来判断距离)和 WLAN 信号(像闻到附近 Wi-Fi 的"气味"来判断位置)三种方式来确定你在哪。采样率就像"眨眼频率"——采样率越高越灵敏,但也越费电。
26.2 传感器使用
// 订阅方向传感器数据SensorAgentsensorAgent=SensorAgent.getSensorAgent();booleansuccess=sensorAgent.setSensorDataCallback(newSensorDataCallback(){@OverridepublicvoidonSensorDataCallback(SensorEventevent){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 控制类小器件
// LED 指示灯控制LightAgentlightAgent=newLightAgent(context);int[]lightIds=lightAgent.getLightIdList();if(lightIds.length>0){lightAgent.turnOn(lightIds[0],newLightEffect.Builder().setLightColor(0xFFFF0000)// 红色.setBlinkMode(LightEffect.BLINK_MODE_TIMED).setBlinkOnTime(500).setBlinkOffTime(500).build());// lightAgent.turnOff(lightIds[0]); // 关闭}// 振动器控制VibratorAgentvibratorAgent=newVibratorAgent(context);vibratorAgent.vibrate(500);// 振动 500 毫秒26.4 位置服务
Locatorlocator=newLocator(context);// 单次定位locator.requestOnce(newLocationRequest(),newMyLocationCallback());// 持续定位locator.startLocating(newLocationRequest(),newMyLocationCallback());// 获取缓存位置(省电方案)LocationcachedLocation=locator.getCachedLocation();classMyLocationCallbackimplementsLocationCallback{@OverridepublicvoidonLocationReport(Locationlocation){HiLog.info(TAG,"纬度: "+location.getLatitude()+", 经度: "+location.getLongitude());}@OverridepublicvoidonErrorReport(inttype){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)功能