sensor使用的一些理解

如果想要调用系统的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循环给你发消息了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值