Android传感器的环境监控

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 元素
注意:在不用对传感器进行监听时,一定要及时的取消监听。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值