Android Sensor框架简述(三)

在上一章Android Sensor框架简述(二) 中,我们最后介绍了应用层获取HAL层上报数据的方式。然而内部的实现逻辑并没有理清楚,现在,看看sensorManager是如何实现监听数据的。

获取sensor manager对象

1
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

这是获取sensorManager的语句,getSystemService方法实际上调用了registerService来获得一个SystemSensorManager的对象

1
2
3
4
5
registerService(SENSOR_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new SystemSensorManager(ctx.getOuterContext(),
ctx.mMainThread.getHandler().getLooper());
}});

SystemSensorManager对象的构造函数使用了JNI的方式获取了一个SensorManager::getInstance()获取了SensorManager的一个单例,并调用了getSensorList的方法,到最终调用了sensorService的的getSensorList方法。

1
2
3
4
5
6
7
8
9
Vector<Sensor> SensorService::getSensorList()
{
char value[PROPERTY_VALUE_MAX];
property_get("debug.sensors", value, "0");
if (atoi(value)) {
return mUserSensorListDebug;
}
return mUserSensorList;
}

获取sensor object

1
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);

getDefaultSensor调用了getSensorList(type)获取指定type的sensor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* Use this method to get the list of available sensors of a certain type.
* Make multiple calls to get sensors of different types or use
* {@link android.hardware.Sensor#TYPE_ALL Sensor.TYPE_ALL} to get all the
* sensors.
*
* @param type
* of sensors requested
*
* @return a list of sensors matching the asked type.
*
* @see #getDefaultSensor(int)
* @see Sensor
*/
public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
List<Sensor> list;
final List<Sensor> fullList = getFullSensorList();
synchronized (mSensorListByType) {
list = mSensorListByType.get(type);
if (list == null) {
if (type == Sensor.TYPE_ALL) {
list = fullList;
} else {
list = new ArrayList<Sensor>();
for (Sensor i : fullList) {
if (i.getType() == type)
list.add(i);
}
}
list = Collections.unmodifiableList(list);
mSensorListByType.append(type, list);
}
}
return list;
}

定义eventListener

1
mLightSensorListener = new SensorEventListener();

这个定义主要是重写了onSensorChanged()onAccuracyChanged()方法,这两个分别是在传感器的数据和精度发生变化的时候进行处理的监听器,代码不再贴。

注册eventListener

1
sensorManager.registerListener(this,gyroscopeSensor,10000);

registerListener调用systemSensorManagerregisterListenerImpl()方法,主要是定义了消息泵Looper,消息队列sensorEventQueue。Looper的实现也是JNI的方式,绑定了一个回调函数handleEvent,再调用了dispatchSensorEvent方法。
dispatchSensorEvent的最后,我们看到了mListener.onSensorChanged(t);,调用该函数做处理。

PS:由于内核代码涉及到机密,部分自定义的代码不贴出来了,源码可以在Google找到。

写在最后的

博主负责的部分不是上层,所以有些机制不能非常深入了解。SensorManager获取数据的大概方式就是如此了。HAL负责数据的上报,SensorManager负责接收给应用使用,中间可以对传感器数据进行处理,滤波,校准等等。

文章目录
  1. 1. 获取sensor manager对象
  2. 2. 获取sensor object
  3. 3. 定义eventListener
  4. 4. 注册eventListener
  5. 5. 写在最后的