傳感器使用簡介

Android 系統提供了對傳感器的支持,若是手機設備的硬件提供了這些傳感器,Android應用能夠經過傳感器來獲取設備的外界條件,包括手機設備的運行狀態、當前擺放方向、外界的磁場、溫度和壓力等。Android 系統提供了驅動程序去管理這些傳感器硬件,當傳感器硬件感知到外部環境發生改變時,Android 系統負責管理這些傳感器數據。java

對於 Android 應用開發者來講,開發傳感器應用十分簡單,開發者只要爲指定監聽器註冊一個監聽器便可,當外部環境發生改變時,Android 系統會經過傳感器獲取外部環境的數據,並將數據傳給監聽器的監聽方法。android

經過在 Android 應用中添加傳感器,能夠充分激發開發者、用戶的想象力,能夠開發出各類新奇的程序,好比電子羅盤、水平儀等;除此以外,還能夠利用傳感器開發各類遊戲,必須經過傳感器來感知用戶動做,從而在遊戲中提供對應的響應。算法

在 Android 系統中開發傳感器應用十分簡單,由於 Android 系統爲傳感器支持強大的管理服務。開發傳感器應用的步驟以下:小程序

  1. 調用 Context 的 getSystemService(Context.SENSOR_SERVICE)方法獲取 SensorManager 對象,SensorManager 對象表明系統的傳感器管理服務。
  2. 調用 SensorManager 的 getDefaultSensor(int type)方法來獲取指定類型的傳感器。
  3. 一般選擇在 Activity 的 onResume()方法中調用 SensorManager 的 registerListener()爲指定傳感器註冊監聽便可。程序經過實現監聽器便可獲取傳感器傳回來的數據。

SensorManager 提供的註冊傳感器的方法爲:registerListener(SensorEventListener listener,Sensor sensor, int rate),該方法中三個參數的說明以下:app

  • listener:監聽傳感器事件的監聽器。該監聽器須要實現 SensorEventListener 接口。
  • sensor:傳感器對象。
  • rate:指定獲取傳感器數據的頻率。

該方法中rate能夠獲取傳感器數據的頻率,它支持如F幾個頻率值。ide

  • SensorManager.SENSOR_DELAY_FASTEST:最快。延遲最小,只有特別依賴於傳感器數據的應用推薦採用這種頻率,該種模式可能形成手機電量大量消耗,因爲傳遞的爲原始數據,算法不處理好將會影響應用的性能。
  • SensorManager.SENSOR_DELAY_GAME:適合遊戲的頻率。在通常實時性要求的應用上適合使用這種頻率。
  • SensorManager.SENSOR_DELAY_NORMAL:正常頻率。  般實時性要求不是特刖高的應用上適合這種頻率。
  • SensorManager.SENSOR_DELAY_UI:適合普通用戶界而的頻率。這種模式比較省電、並且系統開銷也微小,但延遲較大,所以只適合在普通小程序中使用。

main.xml性能

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/tip" />
<EditText
    android:id="@+id/txt1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:editable="false"
    android:cursorVisible="false" />
</LinearLayout>

Manifest.xmlui

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.crazyit.sensor"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />
    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
        <activity android:name=".AccelerometerTest"
                android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

AccelerometerMeter.javathis

package org.crazyit.sensor;

import android.app.Activity;
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.widget.EditText;

/**
 * Description:
 * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>
 * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee kongyeeku@163.com
 * @version  1.0
 */
public class AccelerometerTest extends Activity
    implements SensorEventListener
{
    // 定義系統的Sensor管理器
    SensorManager sensorManager;
    EditText etTxt1;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 獲取程序界面上的文本框組件
        etTxt1 = (EditText) findViewById(R.id.txt1);
        // 獲取系統的傳感器管理服務
        sensorManager = (SensorManager) getSystemService(
            Context.SENSOR_SERVICE);  //
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        // 爲系統的加速度傳感器註冊監聽器
        sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_UI);  //
    }

    @Override
    protected void onStop()
    {
        // 取消註冊
        sensorManager.unregisterListener(this);
        super.onStop();
    }

    // 如下是實現SensorEventListener接口必須實現的方法
    // 當傳感器的值發生改變時回調該方法
    @Override
    public void onSensorChanged(SensorEvent event)
    {
        float[] values = event.values;
        StringBuilder sb = new StringBuilder();
        sb.append("X方向上的加速度:");
        sb.append(values[0]);
        sb.append("\nY方向上的加速度:");
        sb.append(values[1]);
        sb.append("\nZ方向上的加速度:");
        sb.append(values[2]);
        etTxt1.setText(sb.toString());
    }

    // 當傳感器精度改變時回調該方法。
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy)
    {
    }
}

截圖:spa

image

相關文章
相關標籤/搜索