美文网首页
android传感器

android传感器

作者: MrMagicWang | 来源:发表于2016-09-19 20:25 被阅读402次
    android传感器的种类
    Sensor framework

    使用Android的sensor framework,可以访问设备上可用的传感器,获取传感器原始数据。比如:

    1.查看设备上可用的传感器。
    2.查看某一个传感器的性能,比如它的量程、分辨率、能量要求等。
    3.获取测量数据,并且设置刷新频率。
    4.注册和注销传感器事件监听器。

    Sensor framework是android.hardware这个包的一部分,包含下面一些重要的类:SensorManager, Sensor, SensorEvent, SensorEventListener

    识别传感器

    Android sensor framework提供了一些方法,使得在运行时可以方便地查看设备上都有哪些传感器。
    首先,需要获取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()方法并且传入特定的传感器类型,可以得到此类型的默认传感器。

    使用传感器之前需要检测相应的传感器是否存在,因为并不是没台设备都包含想要使用的传感器

    Sensor mSensor = mManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
    if (mSensor == null){
          //传感器不存在
    }
    

    还可以通过Android Market过滤器来限定目标设备必须带有指定的传感器

     <uses-feature
         android:name="android.hardware.sensor.orientation"
         android:required="true">
     </uses-feature>
    
    监听传感器事件

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

    private SensorEventListener listener = new SensorEventListener() {
        /**
         * 传感器事件值改变回调
         */
        @Override
        public void onSensorChanged(SensorEvent event) {
            //判断传感器
            if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
                //读取传感器测量值  
                float angularX = event.values[0];
            }
        }
        /**
         * 传感器精度发生改变时候的回调
         */
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
        }
    };
    
    注册和注销传感器监听

    通过registerListener方法注册传感器监听

      protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(listener, mLight, SensorManager.SENSOR_DELAY_NORMAL);
      }
    

    通过unregisterListener方法注销传感器监听

      protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(listener);
      }
    

    注:当不需要传感器时你应该关闭它,特别是activity暂停的时候。如果不这么做你的电池会很快消耗完,系统不会在屏幕关闭的时候自动关闭传感器。

    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 listener。

    传感器坐标系统

    通常,sensor framework使用一个标准的三轴坐标系统来表达数值。

    对于大多数传感器来说,坐标系统是相对于设备屏幕来说的。

    当一个设备被放在其默认的方向上时,X轴是水平指向右的,Y轴是垂直向上的,Z轴是指向屏幕正面之外的,即屏幕背面是Z的负值。


    在屏幕方向改变的时候,坐标系中的轴是不会交换的。

    不能假设设备的自然(默认)方向是竖直的(portrait),自然方向对于很多的平板设备来说是横向的(landscape)。

    坐标系永远是基于设备的自然方向的。

    相关文章

      网友评论

          本文标题:android传感器

          本文链接:https://www.haomeiwen.com/subject/kslnettx.html