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

  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/mengdd/p/2954942.html
Copyright © 2011-2022 走看看