注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Android传感器的环境监控  

2010-05-15 14:09:42|  分类: Android基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
     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 元素
注意:在不用对传感器进行监听时,一定要及时的取消监听。
  评论这张
 
阅读(934)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017