`
kanwoerzi
  • 浏览: 1647286 次
文章分类
社区版块
存档分类
最新评论

Android传感器的环境监控

 
阅读更多
Android传感器可以随处监控环境
如:方向、加速表、光线、磁场、临近性、温度等
android.hardware.SensorManager包含几个常量,这表示Android传感器系统的不同方面,包括:

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

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

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

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

要与传感器交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。注册使用SensorManager类的registerListener方法完成。本文中的代码示例演示了如何注册和注销SensorListener。
示例1
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.widget.TextView;
importandroid.hardware.SensorManager;
importandroid.hardware.SensorListener;
publicclassIBMEyesextendsActivityimplementsSensorListener{
finalStringtag="IBMEyes";
SensorManagersm=null;
TextViewxViewA=null;
TextViewyViewA=null;
TextViewzViewA=null;
TextViewxViewO=null;
TextViewyViewO=null;
TextViewzViewO=null;

/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//getreferencetoSensorManager
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);
}
publicvoidonSensorChanged(intsensor,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("OrientationX:"+values[0]);
yViewO.setText("OrientationY:"+values[1]);
zViewO.setText("OrientationZ:"+values[2]);
}
if(sensor==SensorManager.SENSOR_ACCELEROMETER){
xViewA.setText("AccelX:"+values[0]);
yViewA.setText("AccelY:"+values[1]);
zViewA.setText("AccelZ:"+values[2]);
}
}
}

publicvoidonAccuracyChanged(intsensor,intaccuracy){
Log.d(tag,"onAccuracyChanged:"+sensor+",accuracy:"+accuracy);
}
@Override
protectedvoidonResume(){
super.onResume();
//registerthisclassasalistenerfortheorientationandaccelerometersensors
sm.registerListener(this,
SensorManager.SENSOR_ORIENTATION|SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protectedvoid onPause()(){
//unregisterlistener
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元素
注意:在不用对传感器进行监听时,一定要及时的取消监听。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics