Pro Android学习笔记(一五二):传感器(2):光传感器

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei。

光传感器比较简单,智能手机都会具有,读取光亮度值,单位为SI lux。维基百科:1流明每平方米面积,就是1勒克斯(lux)。而SI,即国际单位制,一串法文。小例子很简单,获取传感器,甚至监听器,将监听器监听到的数值在TextView上显示。

Pro Android学习笔记(一五二):传感器(2):光传感器_第1张图片

public class LightSensorActivity extends Activity implements SensorEventListener{
    private SensorManager sensorManager = null;
    private Sensor lightSensor = null;
    private TextView tv = null;
     

   @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sensor_list_activity); //使用相同的layout
        tv = (TextView)findViewById(R.id.sensor_list_text);

       
        //【1】获取Light传感器
        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);       
    }     

   @Override
    /* 【2】如果有人监听传感器,传感器工作,需要耗电,因此我们应该只在需要的时候进行监听,本例子如果activity不在前台就不需要监听,因此在onResume()注册监听器,在onPause()中注销监听器 */
    protected void onResume() {
        /* 第三个参数是指Sensor Event变化通知的频率,有效值为NORMAL,UI,GAME,FASTER。有些传感器很灵敏,短时间会有大量数据,对内存和垃圾回收造成压力,可能会导致APP的性能问题,因此根据需要选择合适的频率。对于旋转矢量传感器,通常需要不断地去读取。*/
        sensorManager.registerListener(this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
        super.onResume();
    }

    @Override
    protected void onPause() { 
        sensorManager.unregisterListener(this,lightSensor);
        super.onPause();
    }
    
    /*【3】SensorEventListener要实现两个接口onAccuracyChanged()和onSensorChanged()。onAccuracyChanged()会在精度改变或在注册监听器时调用。accuracy分为4档,0(unreliable),1(low),2(medium),3(high)。注意0并不代表有问题,同时是传感器需要校准。 */
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
        showInfo(sensor.getName() + " accuracy changed: " + accuracy);
    }

    @Override
    /*【3】SensorEventListener要实现两个接口onAccuracyChanged()和onSensorChanged()。
     * onSensorChanged()在传感器数值发生变化已经注册监听器时调用,其更新频率就是注册中的参数三。 对于光传感器,有效数值存放在values[0]中的,单位为SI lunx。光传感器通常位于上方(一般靠左侧), 除了前置摄像头外还有一个孔,一般就是它。遮盖会触发onSensorChanged()* /

   public void onSensorChanged(SensorEvent event)
        showInfo("Get Sensor Event: " + event.sensor.getName() + " " +event.values[0] );
    }        

    private void showInfo(String info){
        tv.append("\n" + info);
        Log.d("LightSensor",info);
    }

}

传感器的读取是通过监听器,即是异步方式,读取不是实时性的。如果我们真的要读取当前的值,可以通过JNI和底层原生API的方式。但一般而言,虽然不是绝对实时,也算敏感,一般的APP没有问题。

即使我们设置了SENSOR_DELAY_FASTEST,通常最快为20ms(和具体的设备有关),如果我们需要比SENSOR_DELAY_FASTEST的频率还要看,那就需要JNI从底层获取。

在Android2.x的版本中,屏幕黑了,即休眠后,传感器会出现不更新的情况,即便设置了wake lock。

相关小例子代码:Pro Android学习:传感器小例子

相关链接:我的Android开发相关文章

你可能感兴趣的:(Pro Android学习笔记(一五二):传感器(2):光传感器)