1. 程式人生 > >2.感測器學習筆記之光照感測器

2.感測器學習筆記之光照感測器

      這節課我們來學習安卓中的光照感測器,已經會的請繞過此篇。

      安卓系統有個自動調整螢幕亮度的功能。 它會檢測手機周圍環境的光照強度, 然後對手機螢幕的亮度進行相應地調整, 以此保證不管是在強光還是弱光下,手機螢幕都能夠看得清。

說的太多理論有點虛,這裡直接實戰實用光照感測器做個專案。

本課目標:

編寫一個簡易的光照探測器程式,使手機可以檢測到周圍環境的光照強度變化。

效果圖:

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 } }; }