2015年7月30日星期四

调用手机光照传感器测光强

娘希匹的,昨天就写好了这个blog,发布的时候翻墙失败,也没保存成功,现在重写。

简单调用手机的光照传感器来检测环境的光强,很easy哒。

Android的每个传感器的用法都很相似,首先要获取SensorManager的实例,

1.获取SensorManager实例

SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

2.调用具体的传感器

SensorManager是系统所有传感器的管理器,有了它的实例后就可以调用getDefultSensor()方法来得到任意的传感器类型,

Sesnor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);//这里是光照传感器

4.对传感器输出的信号进行监听

private SensorEventListener listener = new SensorEventListener() {

@Override
public void onSensorChanged(SensorEvent event) {
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};

这里的SensorEventListener接口定义了两个方法,当传感器精度发生变化时调用onAccuracyChanged方法,当传感器检测到的数值变化时调用onSensorChanged()方法。
onSensorChanged()方法传入了一个名为SensorEvent的参数,其中包含了一个values数组,所有传感器的信息都存放在values数组里。

5.注册传感器的监听器

接下来需要调用SensorManager的registerListener()方法来注册SensorEventListener才能使其生效,这里的registerListener()方法接收了三个参数,第一个为SensorEventListener的实例,第二个为Sensor实例,第三个为传感器输出信息的更新速度,有ENSOR_DELAY_UI、SENSOR_DELAY_NORMAL、SENSOR_DELAY_GAME和SENSOR_DELAY_FASTEST四个可选,它们的更新速度依次递增。

sensorManager.registerListener(listener, sensor,
SensorManager.SENSOR_DELAY_NORMAL);

这就是(光线)传感器的简单用法,接下来上实例吧~~

-----------------------------------------------------

1.布局文件只要一个TextView,简单粗暴,能显示光强即可。

    <TextView
        android:id="@+id/light_level"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:layout_centerInParent="true" 
        android:textSize="20sp"/>

2.MainActivity部分代码,

public class MainActivity extends Activity {

private SensorManager sensorManager;

private TextView lightLevel;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lightLevel = (TextView) findViewById(R.id.light_level);// 获取TextView实例
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);// 获取光照传感器实例
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(listener, sensor,
SensorManager.SENSOR_DELAY_NORMAL);// 注册光照传感器的监听器
}

@Override
protected void onDestroy() {
super.onDestroy();
if (sensorManager != null) {
sensorManager.unregisterListener(listener);// 释放传感器
}
}

private SensorEventListener listener = new SensorEventListener() {

@Override
public void onSensorChanged(SensorEvent event) {
// values数组中第一个下标的值就是当前的光照强度
float value = event.values[0];
lightLevel.setText("Current light level is " + value + "lx");
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// 当传感器光强变化时调用
}
};
}

注意,这里的values中只有一个值——光强,存储在values[0]中。

3.运行之



595.01lx(勒克斯),这个值是我测到的座位附近最大值,它是不断变化的呦,这个要感谢可爱的onSensorChanged()方法~

LOL !

没有评论:

发表评论