2.感測器學習筆記之光照感測器
阿新 • • 發佈:2019-01-31
這節課我們來學習安卓中的光照感測器,已經會的請繞過此篇。
安卓系統有個自動調整螢幕亮度的功能。 它會檢測手機周圍環境的光照強度, 然後對手機螢幕的亮度進行相應地調整, 以此保證不管是在強光還是弱光下,手機螢幕都能夠看得清。
說的太多理論有點虛,這裡直接實戰實用光照感測器做個專案。
本課目標:
編寫一個簡易的光照探測器程式,使手機可以檢測到周圍環境的光照強度變化。
效果圖:
1.首先我們新建一個安卓工程:
2.用TextView來顯示當前的光照強度
這裡使用一個TextView控制元件來顯示光照強度。
activity_main佈局檔案如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xingyun.androidlightsensordemo.MainActivity" >
<TextView
android:id ="@+id/light_level_id"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
android:textSize="20sp"/>
</RelativeLayout>
3.MainActivity.java 後臺處理程式碼:
package com.xingyun.androidlightsensordemo;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
private TextView showLightLevelTextView;// 顯示光照感測器強度
private SensorManager sensorManager;// 感測器管理器
private Sensor lightSensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showLightLevelTextView = (TextView) findViewById(R.id.light_level_id);
/***************************************************************************
*
* SensorManager是系統所有感測器的管理器,有了它的例項之後
*
* 就可以呼叫 getDefaultSensor()方法來得到任意的感測器型別了
*
* Sensor.TYPE_LIGHT 常量來指定感測器型別
*
************************************************************************/
// 獲取到 SensorManager的例項
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 指定感測器型別為光照感測器
lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
/*
* 這個方法在活動準備好和使用者進行互動的時候呼叫。 此時的活動一定位於返回棧的棧頂,並且處於執行狀態。
* */
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
/*
* registerListener()方法接收三個引數 第一個引數就是 SensorEventListener 的例項,
* 第二個引數是 Sensor 的例項,這兩個引數我們在前面都已經成功得到了。
* 第三個引數是用於表示感測器輸出資訊的更新速率,它們的更新速率是依次遞增的。
*/
// 呼叫 SensorManager的 registerListener()方法來註冊 使得監聽生效
sensorManager.registerListener(listener, lightSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
/*
* 這個方法在系統準備去啟動或者恢復另一個活動的時候呼叫。
* 我們通常會在這個方法中將一些消耗 CPU 的資源釋放掉,以及儲存一些關鍵資料,但這個方法的執行速度
* 一定要快,不然會影響到新的棧頂活動的使用*/
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
sensorManager.unregisterListener(listener);
}
//這個方法在活動被銷燬之前呼叫,之後活動的狀態將變為銷燬狀態。
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if (sensorManager != null) {
sensorManager.unregisterListener(listener);
}
}
/**
* 需要對感測器輸出的訊號進行監聽,這就要藉助 SensorEventListener來實現。 SensorEventListener
* 是一個介面,其中定義了 onSensorChanged()和 onAccuracyChanged()這兩個方法
*/
private SensorEventListener listener = new SensorEventListener() {
// 當感測器的精度發生變化時就會呼叫 onAccuracyChanged()方法,
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
/*********************************************************
*
* onSensorChanged()方法中傳入了 一個 SensorEvent 引數
*
* 這個引數裡又包含了一個 values 陣列,所有感測器輸出的資訊都是存放在這裡的.
*
* ******************************************************/
float value = event.values[0];
//顯示當前螢幕亮度值
showLightLevelTextView.setText("當前光照強度為:" + value + "lx");
}
// 當感測器監測到的數值發生變化時就會呼叫 onSensorChanged()方法。
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
}