開發(fā)太陽能手電筒###
作為一個世上有名的發(fā)明家搀崭,發(fā)明些對普通人類非常有用的日常用品叨粘,也是一個科學家的職責。
“我最近發(fā)明了一種東西瘤睹,相信可以幫到你升敲。”
“手電筒轰传?”
“錯驴党!這只不是普通的手電筒,這只是不需要電池的太陽能手電筒获茬。在有光的時候港庄,它就會亮倔既。”
“那如果沒有光的時候鹏氧?”
“絕對不會亮渤涌!”
“有沒有可能沒有光的時候它也會亮?”
“問得好把还!關(guān)燈实蓬。”
“你拿另外一只手電筒照著它呢吊履,他就會亮”
如此跨時代的發(fā)明安皱,我不拿出來給大家看看,實在有愧于一個致力于發(fā)展社會生產(chǎn)力的科學家艇炎。
先別下結(jié)論啊酌伊,各位老爺,其實做這么一個發(fā)明缀踪,也是要有勇氣的呀(大霧)
概要:
咳咳居砖,做出這個應用,主要用了光線傳感器和照相機硬件組中的閃光燈
使用Android設備的各種傳感器其實方法大同小異辜贵,都分為以下幾步悯蝉。
1.獲取 SensorManager 的實例:
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
2.獲得指定傳感器實例
Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
TYPE_LIGHT指的就是光線傳感器归形,其它也有各種各樣的傳感器托慨,如加速度傳感器TYPE_ACCELEROMETER,地磁傳感器TYPE_MAGNETIC_FIELD等等暇榴。
3.實現(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代表當傳感器探測到的值發(fā)生變化時調(diào)用厚棵,此處,我將變化后的流明度在TextView中顯示蔼紧。
4.注冊和注銷傳感器
因為傳感器比較耗電婆硬,在不需要使用的時候盡量關(guān)閉,而此應用僅僅只需要在Activity的Resume狀態(tài)時調(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);
}
這樣就完成了感光部分的功能奸例,接下來必須要增加閃光燈的功能才是達文西的巨作啊彬犯。
5.開啟 Camera
要知道相機控件可是需要申請權(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中添加相機的開關(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的實例查吊,判斷是否為空谐区,再判斷是否已經(jīng)打開(或關(guān)閉)閃光燈,然后將參數(shù)設置到相機上逻卖,完成閃光燈的操作宋列。
最后在onSensorChanged中將閃光燈的方法添加進去
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);
}
}
}
完成!其實Camera這個類已經(jīng)被棄用了评也,雖然能用炼杖,但是谷歌更推薦camera2灭返,不過……開啟閃光燈這事兒,用camera2實現(xiàn)簡直代碼太差……我就放棄了……作為一個科學家坤邪,鉆研精神不夠拔鹾!MХ摹婆芦!
-完-