两种方式访问光距感

时间:2022-09-04 09:11:50

最近的一个项目需求,在后摄像头的旁边,加入了一个新的类似摄像头形状的距感(本项目中sensor用的是stk3x1x),要求在距感被遮挡的时候,在APP里面能根据是否被遮挡给出相应提示。

当然开始也是用了一般访问sensor的处理方法

通过监听传感器,考虑到传感器工作,需要耗电,所以最好在需要的时候进行监听,因此在ActivityonResume()注册监听。

@Override

protected void onResume() {

//*/

第三个参数是指SensorEvent变化通知的频率,有效值为NORMALUIGAMEFASTER。有些传感器很灵敏,短时间会有大量数据,对内存和垃圾回收造成压力,可能会导致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档,0unreliable),1low),2medium),3high)。

//*/

@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里或者其下发的相应downup事件中,根据keyCode就可以做相应的处理。