第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)功能