步骤如下:
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),该方法中三个参数的说明如下。
>listener:监听传感器事件的监听器。该监听器需要实现SensorEventListener接口。
>sensor:传感器对象。
>rate:指定获取传感器数据的频率。
该方法中rate可以获取传感器数据的频率,它支持如下几个频率值。
>SensorManager.SENSOR_DELAY_FASTEST:最快。延迟最小,只有特别依赖于传感器数据的应用推荐采用这种频率,该种模式可能造成手机电量大量消耗,由于传递的为原始数据,算法不处理好将会影响应用的性能。
>SensorManager.SENSOR_DELAY_GAME:适合游戏的频率。在一般实时性要求的应用上适合使用这种频率。
>SensorManager.SENSOR_DELAY_NORMAL:正常频率。一般实时性要求不是特别高的应用上适合这种频率。
>SensorManager.SENSOR_DELAY_UI:适合普通用户界面的频率。这种模式比较省电、而且系统开销也很小,但延迟较大,因此只适合在普通小程序中使用。
下面将会按上面的步骤来开发一个加速度传感器应用。该程序的界面很简单,提供一个文本框来显示加速度值即可,此处不再给出界面布局代码。该应用的Activity代码如下。
程序清单:codes1515.1AccelerometerTestsrcorgcrazyitsensorAccelerometerTest.java(选自:《疯狂Java讲义 第2版》)
public class MainActivity extends Activity implements SensorEventListener {
//定义系统的Sensor管理器
SensorManager sensorManager;
EditText etTxt1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_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_GAME);
}
@Override
protected void onStop()
{
//取消注册
sensorManager.unregisterListener(this);
super.onStop();
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
//以下是实现SensorEventListener接口必须实现的方法
//当传感器的值发生改变时回调该方法
float[] values = event.values;
StringBuilder sb = new StringBuilder();
sb.append("X方向上的加速度:");
sb.append(values[0]);
sb.append("
Y方向上的加速度:");
sb.append(values[1]);
sb.append("
Z方向上的加速度:");
sb.append(values[2]);
etTxt1.setText(sb.toString());
}
}
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_GAME); //② } @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(" Y方向上的加速度:"); sb.append(values[1]); sb.append(" Z方向上的加速度:"); sb.append(values[2]); etTxt1.setText(sb.toString()); } // 当传感器精度改变时回调该方法。 @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }