0
点赞
收藏
分享

微信扫一扫

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

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

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

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 
 
         
         //【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学习:传感器小例子


举报

相关推荐

0 条评论