開發(fā)Android太陽能手電筒

開發(fā)太陽能手電筒###


作為一個世上有名的發(fā)明家,發(fā)明些對普通人類非常有用的日常用品,也是一個科學(xué)家的職責(zé)。

“我最近發(fā)明了一種東西,相信可以幫到你?!?/strong>

“手電筒?”
“錯!這只不是普通的手電筒,這只是不需要電池的太陽能手電筒。在有光的時(shí)候,它就會亮?!?/strong>
“那如果沒有光的時(shí)候?”
“絕對不會亮!”
“有沒有可能沒有光的時(shí)候它也會亮?”
“問得好!關(guān)燈?!?/strong>

“你拿另外一只手電筒照著它呢,他就會亮”

如此跨時(shí)代的發(fā)明,我不拿出來給大家看看,實(shí)在有愧于一個致力于發(fā)展社會生產(chǎn)力的科學(xué)家。

先別下結(jié)論啊,各位老爺,其實(shí)做這么一個發(fā)明,也是要有勇氣的呀(大霧)


概要:

咳咳,做出這個應(yīng)用,主要用了光線傳感器和照相機(jī)硬件組中的閃光燈

使用Android設(shè)備的各種傳感器其實(shí)方法大同小異,都分為以下幾步。

1.獲取 SensorManager 的實(shí)例:

SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

2.獲得指定傳感器實(shí)例

Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

TYPE_LIGHT指的就是光線傳感器,其它也有各種各樣的傳感器,如加速度傳感器TYPE_ACCELEROMETER,地磁傳感器TYPE_MAGNETIC_FIELD等等。

3.實(shí)現(xiàn)SensorEventListener

class MySensorListener implements SensorEventListener {

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
                float value = event.values[0];
                mLightLevel.setText("Current light level is \n" + value + "lx");
            }
        }

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

        }
    }

在onSensorChanged代表當(dāng)傳感器探測到的值發(fā)生變化時(shí)調(diào)用,此處,我將變化后的流明度在TextView中顯示。

4.注冊和注銷傳感器

因?yàn)閭鞲衅鞅容^耗電,在不需要使用的時(shí)候盡量關(guān)閉,而此應(yīng)用僅僅只需要在Activity的Resume狀態(tài)時(shí)調(diào)用傳感器即可

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(mListener);
    }

這樣就完成了感光部分的功能,接下來必須要增加閃光燈的功能才是達(dá)文西的巨作啊。

5.開啟 Camera
要知道相機(jī)控件可是需要申請權(quán)限的,所以先在AndroidManifest中增加他們

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.FLASHLIGHT"/>
    <uses-feature android:name="android.hardware.camera" />

然后在onResume和onPause中添加相機(jī)的開關(guān)操作

    public Camera mCamera;
    
    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_UI);
        mCamera = Camera.open();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(mListener);
        mCamera.release();
    }

6.打開和關(guān)閉閃光燈
創(chuàng)建2個十分相似的方法用于打開和關(guān)閉閃光燈

public static void torchLight(Camera mCamera) {
        if (mCamera == null) {
            return;
        }
        Camera.Parameters parameters = mCamera.getParameters();
        if (parameters == null) {
            return;
        }
        if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_TORCH)){
            return;
        }
        Log.i("Light", "torchLight: ");
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(parameters);
    }

    public static void offLight(Camera mCamera) {
        if (mCamera == null) {
            return;
        }
        Camera.Parameters parameters = mCamera.getParameters();
        if (parameters == null) {
            return;
        }
        if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_OFF)){
            return;
        }
        Log.i("Light", "offLight: ");
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        mCamera.setParameters(parameters);
    }

通過mCamera 獲取 Parameters的實(shí)例,判斷是否為空,再判斷是否已經(jīng)打開(或關(guān)閉)閃光燈,然后將參數(shù)設(shè)置到相機(jī)上,完成閃光燈的操作。

最后在onSensorChanged中將閃光燈的方法添加進(jìn)去

        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
                float value = event.values[0];
                mLightLevel.setText("Current light level is \n" + value + "lx");
                if (value > 500) {
                    torchLight(mCamera);
                } else {
                    offLight(mCamera);
                }
            }
        }

完成!其實(shí)Camera這個類已經(jīng)被棄用了,雖然能用,但是谷歌更推薦camera2,不過……開啟閃光燈這事兒,用camera2實(shí)現(xiàn)簡直代碼太差……我就放棄了……作為一個科學(xué)家,鉆研精神不夠啊?。?!

-完-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容