您的位置:首页 > 其它

光照传感器

2016-05-30 12:26 316 查看
转载请注明出处:

今天来学习一下光照传感器:

首先第一步要获取到SensorManager的实例,方法如下:

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

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

Sensor sensor = senserManager.getDefaultSensor(Sensor.TYPE_LIGHT);

这里使用Sensor.TYPE_LIGHT常量来指定传感器类型,此时的Sensor实例就代表着一个光照传感器。Sensor中还有很多其他传感器类型的常量,在后面几节中我们会慢慢学到。

接下来我们需要对传感器输出的信号进行监听,这就要借助SensorEventListener来实现了。SensorEventListener是一个接口,其中定义了onSensorChanged()和onAccuracyChanged()这两个方法,如下所示:

SensorEventListener listener = new SensorEventListener() {

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

 

@Override

public void onSensorChanged(SensorEvent event) {

}

 

};

当传感器的精度发生变化时就会调用onAccuracyChanged()方法,当传感器监测到的数值发生变化时就会调用onSensorChanged()方法。可以看到onSensorChanged()方法中传入了一个SensorEvent参数,这个参数里又包含了一个values数组,所有传感器输出的信息都是存放在这里的。

下面我们还需要调用SensorManager的registerListener()方法来注册SensorEventListener才能使其生效,registerListener()方法接收三个参数,第一个参数就是SensorEventListener的实例,第二个参数是Sensor的实例,这两个参数我们在前面都已经成功得到了。第三个参数是用于表示传感器输出信息的更新速率,共有SENSOR_DELAY_UI、SENSOR_DELAY_NORMAL、SENSOR_DELAY_GAME和SENSOR_DELAY_FASTEST这四种值可选,它们的更新速率是依次递增的。因此,注册一个SensorEventListener就可以写成:

senserManager.registerListener(listener, senser, SensorManager.SENSOR_ DELAY_NORMAL);

另外始终要记得,当程序退出或传感器使用完毕时,一定要调用unregisterListener ()方法将使用的资源释放掉,如下所示:

sensorManager.unregisterListener(listener);

实例:

就是手机当前检测到的光照强度,以勒克斯为单位,我们直接将这个值显示到TextView上即可
光照不需要配置权限


布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.sensor_light.MainActivity" >

<TextView
android:id="@+id/light_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

</RelativeLayout>

MainActivity
package com.example.sensor_light;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

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);
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) {
}

};

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: