2.感應器學習筆記之光照感應器,感應器學習筆記光照
這節課我們來學習安卓中的光照感應器,已經會的請繞過此篇。
安卓系統有個自動調整螢幕亮度的功能。 它會檢測手機周圍環境的光照強度, 然後對手機螢幕的亮度進行相應地調整, 以此保證不管是在強光還是弱光下,手機螢幕都能夠看得清。
說的太多理論有點虛,這裡直接實戰實用光照感應器做個項目。
本課目標:編寫一個簡易的光照探測器程式,使手機可以檢測到周圍環境的光照強度變化。
:
說明:
燈光照到上面數值會發生改變。
友情提示:
模擬器無法感知光照強度,因此建議在真實手機上運行。
本科源碼下載:https://github.com/fairyxingyun/Android_Sensors_API
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 } };}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。