2. 实现传感器列表查询
任务目标
在Android传感器HAL层实现get_sensors_list函数,返回预定义的传感器列表(加速度计、陀螺仪、磁力计),并通过上层Service调用验证列表内容与数量正确。
实现方案
本案例采用标准Android Sensors HAL 1.0接口规范,实现sensors_module_t结构体中的get_sensors_list回调。该函数通过输出参数返回静态定义的传感器数组及数量。上层通过SensorManager.getSensorList()调用,经JNI与HAL层交互完成验证。
关键完整代码
// sensors_hal.c - 传感器HAL层实现
#include <hardware/hardware.h>
#include <hardware/sensors.h>
// 定义三个预置传感器:加速度计、陀螺仪、磁力计
static struct sensor_t sensor_list[] = {
{
.name = "ACCELEROMETER",
.vendor = "AOSP",
.version = 1,
.handle = SENSORS_ACCELERATION_HANDLE,
.type = SENSOR_TYPE_ACCELEROMETER,
.maxRange = 39.24f,
.resolution = 0.01f,
.power = 0.5f,
.minDelay = 5000,
.fifoReservedEventCount = 0,
.fifoMaxEventCount = 0,
.stringType = SENSOR_STRING_TYPE_ACCELEROMETER,
.requiredPermission = "",
.maxDelay = 200000,
.flags = SENSOR_FLAG_CONTINUOUS_MODE,
},
{
.name = "GYROSCOPE",
.vendor = "AOSP",
.version = 1,
.handle = SENSORS_GYROSCOPE_HANDLE,
.type = SENSOR_TYPE_GYROSCOPE,
.maxRange = 34.91f,
.resolution = 0.001f,
.power = 0.6f,
.minDelay = 5000,
.fifoReservedEventCount = 0,
.fifoMaxEventCount = 0,
.stringType = SENSOR_STRING_TYPE_GYROSCOPE,
.requiredPermission = "",
.maxDelay = 200000,
.flags = SENSOR_FLAG_CONTINUOUS_MODE,
},
{
.name = "MAGNETIC_FIELD",
.vendor = "AOSP",
.version = 1,
.handle = SENSORS_MAGNETIC_FIELD_HANDLE,
.type = SENSOR_TYPE_MAGNETIC_FIELD,
.maxRange = 2000.0f,
.resolution = 0.01f,
.power = 0.5f,
.minDelay = 5000,
.fifoReservedEventCount = 0,
.fifoMaxEventCount = 0,
.stringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD,
.requiredPermission = "",
.maxDelay = 200000,
.flags = SENSOR_FLAG_CONTINUOUS_MODE,
}
};
static int get_sensors_list(struct sensors_module_t *module,
struct sensor_t const **list) {
*list = sensor_list;
return sizeof(sensor_list) / sizeof(sensor_list[0]);
}
static struct hw_module_methods_t sensors_methods = {
.open = NULL // 本案例仅验证列表查询,open不涉及
};
struct sensors_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = SENSORS_MODULE_API_VERSION_1_0,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = SENSORS_HARDWARE_MODULE_ID,
.name = "AOSP Sensors HAL",
.author = "AOSP",
.methods = &sensors_methods,
},
.get_sensors_list = get_sensors_list,
};
编译与部署
# 在Android源码树中编译HAL模块
mmm hardware/libhardware/modules/sensors/
# 将生成的so文件推送到设备
adb root
adb remount
adb push out/target/product/<device>/system/lib/hw/sensors.<device>.so /system/lib/hw/
adb reboot
上层验证方法
编写一个简单的Android应用或使用adb shell命令验证传感器列表:
// 在应用或测试代码中执行
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL);
for (Sensor s : sensors) {
Log.d("SensorTest", "name=" + s.getName() + ", type=" + s.getType());
}
验证判定标准
- 日志中输出3条传感器记录,名称分别为
ACCELEROMETER、GYROSCOPE、MAGNETIC_FIELD - 每个传感器的
type值分别为1(加速度计)、4(陀螺仪)、2(磁力计) - 使用
adb shell dumpsys sensorservice可看到对应传感器注册信息
预期输出
D/SensorTest: name=ACCELEROMETER, type=1
D/SensorTest: name=GYROSCOPE, type=4
D/SensorTest: name=MAGNETIC_FIELD, type=2
说明:上述输出为代码逻辑直接推出的确定性结果,非实测数据。实际运行需在真实设备或模拟器上执行验证。