本文针对android 2.3 版本的sensor从应用到hal层接口进行逐层分析。4.0的代码也拿到了,不过还没有来得及进行分析。 一、应用程序,一般的应用程序写法: package com.sensors.testSensor; import android.app.Activity; import android.os.Bundle;
import android.util.Log; import android.widget.TextView; import android.hardware.SensorManager; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener;
public class testSensor extends Activity { SensorManager sensormanager = null; Sensor lightSensor = null; TextView accTextView = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensormanager = (SensorManager)getSystemService(SENSOR_SERVICE); // 获取SensorManager 客户端对象 lightSensor = sensormanager.getDefaultSensor(Sensor.TYPE_LIGHT); // 获取LIGTH传感器,或者直接传入Sensor.TYPE_ALL 获取所有的sensorList accTextView = (TextView)findViewById(R.id.textview_name); }
SensorEventListener lsn = new SensorEventListener() { public void onSensorChanged(SensorEvent e) { if (e.sensor == lightSensor) { Log.d("sensor", "found light sensor"); accTextView.setText("data is " + e.values[0]); } }
public void onAccuracyChanged(Sensor s, int accuracy) { //TODO } }; @Override protected void onResume() { //注册传感器 super.onResume(); // register this class as a listener for the orientation and accelerometer sensors sensormanager.registerListener(lsn, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onStop() { // unregister listener sensormanager.unregisterListener(lsn, lightSensor); super.onStop(); } } 总之,应用中实现如下两个重要回调函数即可捕获sensor data数据: public void onSensorChanged(SensorEvent e) 首先来张整体模块图,让大家有个总体认识 : 二、分析客户端的实现 首先获取到所有sensor列表 /* sensorservice 往管道中写入数据 */ 对于SensorManager.cpp 说明一下: 首先获取sensorService的服务: const String16 name("sensorservice"); 三、分析服务端的实现 sensorService的注册: system_init.cpp extern "C" status_t system_init() // Start the sensor service } --> static void instantiate() { publish(); } static status_t publish() { 利用BinderService的publish方法进行注册,所以可以在这里看到: class SensorService : 重要的一些函数说明: 加入监控的sensor设备 四、客户端与服务端通讯过程 利用binder机制即可,列出重要的代码: class ISensorEventConnection : public IInterface // 用于客户端 ... } class BnSensorEventConnection : public BnInterface<ISensorEventConnection> // 服务端代码 { 实现中重要的实现: IMPLEMENT_META_INTERFACE(SensorEventConnection, "android.gui.SensorEventConnection"); status_t BnSensorEventConnection::onTransact( case XXX: break; } return BBinder::onTransact(code, data, reply, flags); } ok, 对于binder机制的问题可以参考, 在此就不详细介绍了: http://blog.csdn.net/andyhuabing/article/details/7004593 五、 HAL层接口 上层调用类 SensorDevice: 主要调用逻辑: // 加载动态库 status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, // 打开sensor 设备 sensors_open(&mSensorModule->common, &mSensorDevice); 最重要的四个hal接口函数: int (*get_sensors_list)(struct sensors_module_t* module, int (*activate)(struct sensors_poll_device_t *dev, int (*setDelay)(struct sensors_poll_device_t *dev, int (*poll)(struct sensors_poll_device_t *dev, 这块代码实现可以参考: device\htc\passion-common\libsensors |
|