您的位置:首页 > 移动开发 > Android开发

Android传感器的环境监控

2012-11-16 09:58 232 查看
Android 传感器可以随处监控环境

如:方向、加速表、光线、磁场、临近性、温度等

android.hardware.SensorManager 包含几个常量,这表示 Android 传感器系统的不同方面,包括:

传感器类型方向、加速表、光线、磁场、临近性、温度等。采样率最快、游戏、普通、用户界面。当应用程序请求特定的采样率时,其实只是对传感器子系统的一个提示,或者一个建议。不保证特定的采样率可用。准确性高、低、中、不可靠。

SensorListener 接口是传感器应用程序的中心。它包括两个必需方法:

onSensorChanged(int sensor,float values[]) 方法在传感器值更改时调用。该方法只对受此应用程序监视的传感器调用(更多内容见下文)。该方法的参数包括:一个整数,指示更改的传感器;一个浮点值数组,表示传感器数据本身。有些传感器只提供一个数据值,另一些则提供三个浮点值。方向和加速表传感器都提供三个数据值。

当传感器的准确性更改时,将调用 onAccuracyChanged(int sensor,int accuracy) 方法。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。

要与传感器交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。注册使用 SensorManager 类的registerListener 方法完成。本文中的 代码示例 演示了如何注册和注销 SensorListener。

示例1:

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 onPause()() {

// unregister listener

sm.unregisterListener(this);

super.onPause()();

}

}

该活动的 onCreate 方法可以引用 SensorManager,其中包含所有与传感器有关的函数。

onCreate 方法还建立了对 6 个 TextView 小部件的引用,您需要使用传感器数据值更新这些小部件。

onResume() 方法使用对 SensorManager 的引用通过 registerListener 方法注册传感器更新:

第一个参数是实现 SensorListener 接口的类的实例。

第二个参数是所需传感器的位掩码。在本例中,应用程序从 SENSOR_ORIENTATION 和 SENSOR_ACCELEROMETER 请求数据。

第三个参数是一个系统提示,指出应用程序更新传感器值所需的速度。

应用程序(活动)暂停后,需要注销侦听器,这样以后就不会再收到传感器更新。

这通过 SensorManager 的 unregisterListener 方法实现。惟一的参数是 SensorListener 的实例。

在 registerListener 和 unregisterListener 方法调用中,应用程序使用关键字 this。

注意类定义中的 implements 关键字,其中声明了该类实现 SensorListener 接口。这就是要将它传递到 registerListener 和 unregisterListener 的原因。

SensorListener 必须实现两个方法 onSensorChange 和 onAccuracyChanged。

示例应用程序不关心传感器的准确度,但关注传感器当前的 X、Y 和 Z 值。

onAccuracyChanged 方法实质上不执行任何操作;它只在每次调用时添加一个日志项。

似乎经常需要调用 onSensorChanged 方法,因为加速表和方向传感器正在快速发送数据。

查看第一个参数确定哪个传感器在发送数据。确认了发送数据的传感器之后,

将使用方法第二个参数传递的浮点值数组中所包含的数据更新相应的 UI 元素

注意:在不用对传感器进行监听时,一定要及时的取消监听。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: