如果想要调用系统的sensor,那就得用到系统自带的sensorservice。一般的调用方法是.
先开启服务:
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);//这个是light sensor的实例
然后声明一个监听函数
listen = new SensorEventListener(){
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {//当sensor有事件时会发回一个消息;
}
}
当需要开启sensor时。用mSensorManager.registerListener(mSensorEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);来注册到sensorservice的列表中。
当需要关闭时,用 mSensorManager.unregisterListener(mSensorEventListener);实现取消注册
在Java层Sensor的状态控制由SensorService来负责,它的java代码和JNI代码分别位于:
frameworks/base/services/java/com/android/server/SensorService.java
frameworks/base/services/jni/com_android_server_SensorService.cpp
在Java层Sensor的数据控制由SensorManager来负责,它的java代码和JNI代码分别位于:
frameworks/base/core/java/android/hardware/SensorManager.java
frameworks/base/core/jni/android_hardware_SensorManager.cpp
在java层中,当mSensorManager.registerListener(mSensorEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);时会跑到sensorManager.java中去。函数首先会判断mSensorEventListener是否在当前的listen的列表中,
如果在直接mSensorService.enableSensor(l, name, handle, delay)打开sensor。如果不在那么会将mSensorEventListener加入列表,然后判断listen的列表是否为空,如果是就会创建一个thread。sSensorThread.startLocked
(mSensorService)这个是sensor的核心,在这个线程中sensor会调用JNI的函数sensors_data_poll(values, status, timestamp)来一直poll,当有event的时候,sensorservice会将event发给对应的listener,
在JNI部分Android对于Sensor的API定义在 hardware/libhardware/include/hardware/sensor.h中, 要求在sensor.so提供以下8个API函数
[控制方面]
int (*open_data_source)(struct sensors_control_device_t *dev);
int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled);
int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);
int (*wake)(struct sensors_control_device_t *dev);
[数据方面]
int (*data_open)(struct sensors_data_device_t *dev, int fd);
int (*data_close)(struct sensors_data_device_t *dev);
int (*poll)(struct sensors_data_device_t *dev, sensors_data_t* data);
[模块方面]
int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t const** list);
sensorService.cpp和sensorManger.cpp通过hardware.c与sensor.so通信。其中sensorService.cpp实现对sensor的状态控制,sensorManger.cpp实现对sensor的数据控制。
sensor.so通过ioctl控制sensor driver的状态,通过打开sensor driver对应的设备文件读取G-sensor采集的数据
在sSensorThread.startLocked时,会先调用getDataChannel().这个在sensorservice中,然后调用_sensors_control_open()。此时反问JNI层的函数对应的是android_open。在android_open中系统通过native_handle_t* handle =
sSensorDevice->open_data_source(sSensorDevice);从sensor.cpp中获得我们要打开sensor的fd还有其他的一些信息。对应硬件这块具体操作是在sensor.cpp中完成的,包括data_open,data_close,sensor_poll等等上面提过的
shensor.so的api。
当创建一个thread后,会调用mSensorService.enableSensor(l, name, handle, delay)打开sensor。这个函数主要是调用_sensors_control_activate来激活sensor,这一切做完了,基本上就是等底层的poll循环给你发消息了。