Android光线传感器获取光线强弱。LightSensorManager封装类
2017-01-09 16:36
288 查看
在Android开发中,有时我们需要获知设备所在环境的光线强弱情况,当然这需要我们设备拥有光线传感器
下面是我简单封装的一个光线传感器管理类,主要提供了3个方法:
1.start():启动,在获取光照强度前调用。
2.stop():停止,在不再需要获取光照强度后调用。
3.getLux():获取光照强度,单位为勒克斯(lux)。
如果你需要额外的一些方法,可以根据返回的光照强度自行添加。下面是整个LightSensorManager类
[java] view
plain copy
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
public class LightSensorManager {
private static final boolean DEBUG = true;
private static final String TAG = "LightSensor";
private static LightSensorManager instance;
private SensorManager mSensorManager;
private LightSensorListener mLightSensorListener;
private boolean mHasStarted = false;
private LightSensorManager() {
}
public static LightSensorManager getInstance() {
if (instance == null) {
instance = new LightSensorManager();
}
return instance;
}
public void start(Context context) {
if (mHasStarted) {
return;
}
mHasStarted = true;
mSensorManager = (SensorManager) context.getApplicationContext().getSystemService(Context.SENSOR_SERVICE);
Sensor lightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); // 获取光线传感器
if (lightSensor != null) { // 光线传感器存在时
mLightSensorListener = new LightSensorListener();
mSensorManager.registerListener(mLightSensorListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); // 注册事件监听
}
}
public void stop() {
if (!mHasStarted || mSensorManager == null) {
return;
}
mHasStarted = false;
mSensorManager.unregisterListener(mLightSensorListener);
}
/**
* 获取光线强度
*/
public float getLux() {
if (mLightSensorListener != null) {
return mLightSensorListener.lux;
}
return -1.0f; // 默认返回-1,表示设备无光线传感器或者为调用start()方法
}
private class LightSensorListener implements SensorEventListener {
private float lux; // 光线强度
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
// 获取光线强度
lux = event.values[0];
if (DEBUG) {
Log.d(TAG, "lux : " + lux);
}
}
}
}
}
对于这个光线强度的值。越暗数值越低,最低应该是0,在白天室内大概有300左右,仅供参考,不知道不同的设备会不会存在一定误差。
调用程序就不贴了,通过log就可以很直接的看得到数据了。这个类在我的自定义相机里自动调节曝光程度使用到了,效果还是有的。
下面是我简单封装的一个光线传感器管理类,主要提供了3个方法:
1.start():启动,在获取光照强度前调用。
2.stop():停止,在不再需要获取光照强度后调用。
3.getLux():获取光照强度,单位为勒克斯(lux)。
如果你需要额外的一些方法,可以根据返回的光照强度自行添加。下面是整个LightSensorManager类
[java] view
plain copy
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
public class LightSensorManager {
private static final boolean DEBUG = true;
private static final String TAG = "LightSensor";
private static LightSensorManager instance;
private SensorManager mSensorManager;
private LightSensorListener mLightSensorListener;
private boolean mHasStarted = false;
private LightSensorManager() {
}
public static LightSensorManager getInstance() {
if (instance == null) {
instance = new LightSensorManager();
}
return instance;
}
public void start(Context context) {
if (mHasStarted) {
return;
}
mHasStarted = true;
mSensorManager = (SensorManager) context.getApplicationContext().getSystemService(Context.SENSOR_SERVICE);
Sensor lightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); // 获取光线传感器
if (lightSensor != null) { // 光线传感器存在时
mLightSensorListener = new LightSensorListener();
mSensorManager.registerListener(mLightSensorListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); // 注册事件监听
}
}
public void stop() {
if (!mHasStarted || mSensorManager == null) {
return;
}
mHasStarted = false;
mSensorManager.unregisterListener(mLightSensorListener);
}
/**
* 获取光线强度
*/
public float getLux() {
if (mLightSensorListener != null) {
return mLightSensorListener.lux;
}
return -1.0f; // 默认返回-1,表示设备无光线传感器或者为调用start()方法
}
private class LightSensorListener implements SensorEventListener {
private float lux; // 光线强度
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
// 获取光线强度
lux = event.values[0];
if (DEBUG) {
Log.d(TAG, "lux : " + lux);
}
}
}
}
}
对于这个光线强度的值。越暗数值越低,最低应该是0,在白天室内大概有300左右,仅供参考,不知道不同的设备会不会存在一定误差。
调用程序就不贴了,通过log就可以很直接的看得到数据了。这个类在我的自定义相机里自动调节曝光程度使用到了,效果还是有的。
相关文章推荐
- Android光线传感器获取光线强弱。LightSensorManager封装类
- Android编程使用光线传感器获取光线强弱的方法【LightSensorManager封装类】
- Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】
- android数据存储ContentProvider数据获取ContentResolver
- Ubuntu9.10下获取Android源码
- Android教程之-----Windows环境下,Msysgit获取Android源码。
- Android 获取系统中所有安装的APK的信息
- Android中LocationManager的简单使用,获取当前位置
- Android cupcake源代码获取和编译 for Ubuntu 9.04
- android项目中数据库获取的方法
- Android 程序获取、设置铃声和音量
- android中获取/设置粘贴板中的内容
- android获取源代码、编译、命令
- Android高手进阶教程(十一)之----Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
- Android 获取当前日期 时间
- android http数据通信 通过GET 请求获取数据
- 通过程序获取android系统手机的铃声和音量
- android中动态获取图片资源
- 获取Android的源代码
- Android高手进阶教程(十一)之----Android 通用获取Ip的方法(判断手机是否联网的方法)!!!