1. 程式人生 > >Android光線感測器獲取光線強弱。LightSensorManager封裝類

Android光線感測器獲取光線強弱。LightSensorManager封裝類

在Android開發中,有時我們需要獲知裝置所在環境的光線強弱情況,當然這需要我們裝置擁有光線感測器

下面是我簡單封裝的一個光線感測器管理類,主要提供了3個方法:

1.start():啟動,在獲取光照強度前呼叫。

2.stop():停止,在不再需要獲取光照強度後呼叫。

3.getLux():獲取光照強度,單位為勒克斯(lux)。

如果你需要額外的一些方法,可以根據返回的光照強度自行新增。下面是整個LightSensorManager類


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就可以很直接的看得到資料了。這個類在我的自定義相機裡自動調節曝光程度使用到了,效果還是有的。