最近的一个项目需求,在后摄像头的旁边,加入了一个新的类似摄像头形状的距感(本项目中sensor用的是stk3x1x),要求在距感被遮挡的时候,在APP里面能根据是否被遮挡给出相应提示。
当然开始也是用了一般访问sensor的处理方法
通过监听传感器,考虑到传感器工作,需要耗电,所以最好在需要的时候进行监听,因此在Activity的onResume()注册监听。
@Override
protected void onResume() {
//*/
第三个参数是指SensorEvent变化通知的频率,有效值为NORMAL,UI,GAME,FASTER。有些传感器很灵敏,短时间会有大量数据,对内存和垃圾回收造成压力,可能会导致APP的性能问题,因此根据需要选择合适的频率。对于旋转矢量传感器,通常需要不断地去读取。
//*/
......
mSensorManager.registerListener(this, mPSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
这个,mPSensor,是onCreate()中获取的距感传感器。
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mPSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
在onPause()中注销监听。
@Override
protected void onPause() {
......
mSensorManager.unregisterListener(this, mPSensor);
}
监听传感器,需要实现SensorEventListener接口,重写onAccuracyChanged()和onSensorChanged()两个方法。
//*/
onAccuracyChanged()会在精度改变或在注册监听器时调用。accuracy分为4档,0(unreliable),1(low),2(medium),3(high)。
//*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do nothing
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
//根据value值,这里处理遮挡。
}
}
onSensorChanged()在传感器数值发生变化已经注册监听器时调用,其更新频率就是注册中的第三个参数。 对于传感器,有效数值存放在values[0]中的。
这样处理肯定是没问题的,但是,后面需求又变了,这个stk3x1x传感器的节点要释放给触摸屏用,让改现在的处理方法。设备节点不能用,意味着通过ioctl访问的方式要改了,所幸,我们还有上报键值的方法。
Kernel中的,使能传感器,用如下接口,只是此接口 only enable not report event to HAL。
int (*enable_nodata)(int en);/* only enable not report event to HAL */
所以我在stk3x1x的真正使能处,做如下处理
static int _stk3x1x_enable_ps(struct i2c_client *client, int enable, int validate_reg) {
......
if (1==report_value){
input_report_key(obj->ges_input_dev, xxx_xxx_KEY, 0);
input_sync(obj->ges_input_dev);
}else if (0==report_value){
input_report_key(obj->ges_input_dev, xxx_xxx_KEY, 1);
input_sync(obj->ges_input_dev);
}
}
这样,我们在Activity里或者其下发的相应down和up事件中,根据keyCode就可以做相应的处理。