開發(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é)家,鉆研精神不夠啊?。?!
-完-