萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> 對Android 傳感器的探討

對Android 傳感器的探討

本文導航

1、首頁2、復制代碼-2

這是我們為大家提供的一篇關於對Android 傳感器的探討的文章,接下來就讓我們一起來了解一下吧!

簡介: Android 是一個面向應用程序開發的富平台,它擁有許多具有吸引力的用戶界面元素和數據管理功能。Android 還提供了一組豐富的接口選項。在本文中,學習如何配合使用 Android 的各種傳感器選項監控您的環境。樣例代碼展示了如何在 Android 電話中錄制音頻。想構建自己的嬰兒監視器嗎?想用聲音來接聽電話或者打開房門嗎?請學習如何利用配備有 Android 的設備的硬件功能。

簡介

對於 Java™ 開發人員來說,Android 平台是通過使用硬件傳感器創建創新應用程序的理想平台。我們將學習一些可用於 Android 應用程序的接口連接選項,包括使用傳感器子系統和錄制音頻片段。

利用配備 Android 的設備的硬件功能可以構建哪些應用程序呢?任何需要電子監視和監聽的應用程序都可以構建。嬰兒監視器、安全系統,甚至地震儀都可以。理論上講,您不能同時出現在兩個地方,但 Android 可以利用一些可行的方法實現這一點。縱觀本文始末,您必須記住,使用的 Android 設備不僅僅局限於 “手機”,還可以是部署在固定位置、具有無線網絡連接的設備,比如 EDGE 或 WiFi。下載 本文示例的源文件。

Android 傳感器功能

使用 Android 平台有一個很新穎的地方,那就是您可以在設備內部訪問一些 “好工具”。過去,訪問設備底層硬件的能力一度讓移動開發人員感到非常棘手。盡管 Android Java 環境的角色仍然是您和設備的橋梁,但 Android 開發團隊讓許多硬件功能浮出了水面。該平台是一個開源平台,因此您可以自由地編寫代碼實現您的任務。

如果尚未安裝 Android,您可以 下載 Android SDK。您還可以 浏覽 android.hardware 包的內容並參考本文的示例。android.media 包 包含了一些提供有用和新穎功能的類。

Android SDK 中包含的一些面向硬件的功能描述如下。

表 1. Android SDK 中提供的面向硬件的特性

描述

android.hardware.Camera

允許應用程序與相機交互的類,可以截取照片、獲取預覽屏幕的圖像,修改用來治理相機操作的參數。

android.hardware.SensorManager

允許訪問 Android 平台傳感器的類。並非所有配備 Android 的設備都支持SensorManager 中的所有傳感器,雖然這種可能性讓人非常興奮。(可用傳感器的簡介見下文)

android.hardware.SensorListener

在傳感器值實時更改時,希望接收更新的類要實現的接口。應用程序實現該接口來監視硬件中一個或多個可用傳感器。例如,本文中的 代碼 包含實現該接口的類,實現後可以監視設備的方向和內置的加速表。

android.media.MediaRecorder

用於錄制媒體樣例的類,對於錄制特定位置(比如嬰兒保育)的音頻活動非常有用。還可以分析音頻片段以便在訪問控件或安全應用程序時進行身份鑒定。例如,它可以幫助您通過聲音打開門,以節省時間,不需要從房產經紀人處獲取鑰匙。

android.FaceDetector

允許對人臉(以位圖形式包含)進行基本識別的類。不可能有兩張完全一樣的臉。可以使用該類作為設備鎖定方法,無需記密碼 — 這是手機的生物特征識別功能。

android.os.*

包含幾個有用類的包,可以與操作環境交互,包括電源管理、文件查看器、處理器和消息類。和許多可移動設備一樣,支持 Android 的電話可能會消耗大量電能。讓設備在正確的時間 “醒來” 以監視感興趣的事件是在設計時需要首先關注的方面。

java.util.Date

java.util.Timer

java.util.TimerTask

當測量實際的事件時,數據和時間往往很重要。例如,java.util.Date類允許您在遇到特定的事件或狀況時獲取時間戳。您可以使用java.util.Timer 和java.util.TimerTask分別執行周期性任務或時間點任務。

android.hardware.SensorManager 包含幾個常量,這表示 Android 傳感器系統的不同方面,包括:

傳感器類型方向、加速表、光線、磁場、臨近性、溫度等。

采樣率最快、游戲、普通、用戶界面。當應用程序請求特定的采樣率時,其實只是對傳感器子系統的一個提示,或者一個建議。不保證特定的采樣率可用。

准確性高、低、中、不可靠。

SensorListener 接口是傳感器應用程序的中心。它包括兩個必需方法:

onSensorChanged(int sensor,float values[]) 方法在傳感器值更改時調用。該方法只對受此應用程序監視的傳感器調用(更多內容見下文)。該方法的參數包括:一個整數,指示更改的傳感器;一個浮點值數組,表示傳感器數據本身。有些傳感器只提供一個數據值,另一些則提供三個浮點值。方向和加速表傳感器都提供三個數據值。

當傳感器的准確性更改時,將調用 onAccuracyChanged(int sensor,int accuracy) 方法。參數包括兩個整數:一個表示傳感器,另一個表示該傳感器新的准確值。

要與傳感器交互,應用程序必須注冊以偵聽與一個或多個傳感器相關的活動。注冊使用 SensorManager 類的 registerListener 方法完成。本文中的 代碼示例 演示了如何注冊和注銷 SensorListener。

記住,並非所有支持 Android 的設備都支持 SDK 中定義的所有傳感器。如果某個傳感器無法在特定的設備上使用,您的應用程序就會適當地降級。

傳感器示例

樣例應用程序僅監控對方向和加速表傳感器的更改(源代碼見 下載)。當收到更改時,傳感器值在 TextView 小部件的屏幕上顯示。圖 1 展示了該應用程序的運行情況。

圖 1. 監視加速和方向

Android 傳感器

使用 Eclipse 環境和 Android Developer Tools 插件創建的應用程序。(關於使用 Eclipse 開發 Android 應用程序的信息,請參見 參考資料。)清單 1 展示了該應用程序的代碼。

IBMEyes.java

package com.msi.ibm.eyes;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.widget.TextView;

import android.hardware.SensorManager;

import android.hardware.SensorListener;

public class IBMEyes extends Activity implements SensorListener {

final String tag = "IBMEyes";

SensorManager sm = null;

TextView xViewA = null;

TextView yViewA = null;

TextView zViewA = null;

TextView xViewO = null;

TextView yViewO = null;

TextView zViewO = null;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// get reference to SensorManager

sm = (SensorManager) getSystemService(SENSOR_SERVICE);

setContentView(R.layout.main);

xViewA = (TextView) findViewById(R.id.xbox);

yViewA = (TextView) findViewById(R.id.ybox);

zViewA = (TextView) findViewById(R.id.zbox);

xViewO = (TextView) findViewById(R.id.xboxo);

yViewO = (TextView) findViewById(R.id.yboxo);

zViewO = (TextView) findViewById(R.id.zboxo);

}

public void onSensorChanged(int sensor, float[] values) {

synchronized (this) {

Log.d(tag, "onSensorChanged: " + sensor + ", x: " +

values[0] + ", y: " + values[1] + ", z: " + values[2]);

if (sensor == SensorManager.SENSOR_ORIENTATION) {

xViewO.setText("Orientation X: " + values[0]);

yViewO.setText("Orientation Y: " + values[1]);

zViewO.setText("Orientation Z: " + values[2]);

}

if (sensor == SensorManager.SENSOR_ACCELEROMETER) {

xViewA.setText("Accel X: " + values[0]);

yViewA.setText("Accel Y: " + values[1]);

zViewA.setText("Accel Z: " + values[2]);

}

}

}

public void onAccuracyChanged(int sensor, int accuracy) {

Log.d(tag,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);

}

@Override

protected void onResume() {

super.onResume();

// register this class as a listener for the orientation and accelerometer sensors

sm.registerListener(this,

SensorManager.SENSOR_ORIENTATION |SensorManager.SENSOR_ACCELEROMETER,

SensorManager.SENSOR_DELAY_NORMAL);

}

@Override

protected void onStop() {

// unregister listener

sm.unregisterListener(this);

super.onStop();

}

}

copyright © 萬盛學電腦網 all rights reserved