zoukankan      html  css  js  c++  java
  • Android Sensors (2) 传感器API的使用

     

    识别传感器和传感器能力

      Android sensor framework提供了一些方法,使得你在运行时可以方便地查看设备上都有哪些传感器。

      API也提供了一些让你获取每个传感器性能的方法。

      首先,你需要获取sensor service的一个引用;即通过向 getSystemService()方法中传入SENSOR_SERVICE 参数来创建一个SensorManager类的实例。

    private SensorManager mSensorManager;
    ...
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

      然后,你可以通过在getSensorList() 方法中传入TYPE_ALL 来获取设备上的所有传感器。

    List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);

      如果你想要获取指定类型的一系列传感器,你可以使用参数TYPE_GYROSCOPETYPE_LINEAR_ACCELERATIONTYPE_GRAVITY等。

      如果对于某种特定类型的传感器来说,设备上含有不止一个这种传感器,那么这些传感器中的一个将被指定为这种类型的默认传感器

      使用getDefaultSensor()方法并且传入特定的传感器类型,可以得到此类型的默认传感器

      如果此类型的默认传感器不存在,那么这个方法将会返回null,这就意味着这个设备不含此类型的传感器

      除了列出设备上的传感器,你可以利用Sensor 类中的方法去获得传感器的性能及属性。当你需要你的应用在不同的设备环境下有不同的行为时,这样做是很有用的。

     

    监测传感器事件

      为了检测传感器数据,你需要实现SensorEventListener 接口中的两个回调方法:onAccuracyChanged()和 onSensorChanged()

     

    当传感器的精度改变时:

      系统调用 onAccuracyChanged() 方法,为你提供Sensor对象的引用和新的精度值。

      精度值一般由下面四个状态常量之一表示:SENSOR_STATUS_ACCURACY_LOWSENSOR_STATUS_ACCURACY_MEDIUM,SENSOR_STATUS_ACCURACY_HIGH, or SENSOR_STATUS_UNRELIABLE

     

    当传感器报告一个新的值时:

      系统调用onSensorChanged() 方法,为你提供一个SensorEvent对象。

     

    一个检测传感器事件的例子

      如下面这个例子:

    public class SensorActivity extends Activity implements SensorEventListener {
      private SensorManager mSensorManager;
      private Sensor mLight;
    
      @Override
      public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
      }
    
      @Override
      public final void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
      }
    
      @Override
      public final void onSensorChanged(SensorEvent event) {
        // The light sensor returns a single value.
        // Many sensors return 3 values, one for each axis.
        float lux = event.values[0];
        // Do something with this sensor value.
      }
    
      @Override
      protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
      }
    
      @Override
      protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
      }
    }

    关于数据延迟

      在这个例子中,用 registerListener()注册时使用了默认的数据延迟SENSOR_DELAY_NORMAL

      数据延迟(或叫采样率)控制着通过onSensorChanged() 方法传递传感器事件的间隔。

      默认的数据延迟(200,000 microseconds)对于监控屏幕方向改变比较合适;其他的:

       SENSOR_DELAY_GAME (20,000 microsecond delay), SENSOR_DELAY_UI (60,000 microsecond delay), 

       SENSOR_DELAY_FASTEST (0 microsecond delay),另外Android 3.0 (API Level 11)可以使用绝对值来设置数据延迟(单位是毫秒)。

      你设定的延迟只是一个建议性的延迟,Android系统或其他应用可以改变这个延迟。

      最好的实践经验是,你指定可用的最大延迟,因为系统通常是用一个比你指定的值小一些的值。

      这即是说,你需要指定满足你应用需求的最低的采样率。用比较大的延迟可以使处理器负载较轻,从而消耗更少的能量。

      没有指定sensor framework向应用发送sensor event频率的public的方法,但是,你可以利用每一个sensor event的时间戳去计算几个事件的采样率。

      一旦设定后,你不必改变采样率;如果因为某种理由你必须改变采样率,你必须注销(unregister然后重新注册(reregister这个sensor listener。

     

    注册和注销位置

      这个例子中使用了 onResume() 和onPause() 回调函数来注册和注销传感器事件监听器。

      最佳实践:当你不需要传感器时你应该关闭它,特别是你的activity暂停的时候。

      如果不这么做你的电池会很快消耗完,系统不会在屏幕关闭的时候自动关闭传感器。

     

     

    参考资料

      API Guides:Sensors Overview

      http://developer.android.com/guide/topics/sensors/sensors_overview.html

  • 相关阅读:
    数据结构 练习 22-并查集以及图的最小生成树
    C# 上传RAR文件 解压 获取解压后的文件名称
    [置顶] 程序员学数据库那些事儿
    编程挑战:字符串的完美度
    Hibernate主键生成策略
    利用冒泡排序对数组进行排序
    小学生玩ACM----广搜
    CGContext绘图
    [置顶] 《Windows编程零基础》__2 一个完整的程序
    java 网络编程
  • 原文地址:https://www.cnblogs.com/mengdd/p/2954942.html
Copyright © 2011-2022 走看看