android 传感器必知必会 (上)

来源:互联网 发布:vb牛顿迭代法求平方根 编辑:程序博客网 时间:2024/05/12 16:25

现代的android设备已经不在是简单的通信或者web浏览平台。这些设备能够使用硬件传感器(一如加速计,陀螺仪,气压表)来作为人的感官补充。

检测物理环境属性的传感器为增加移动应用的用户体验提供了令人激动的创新机会

本文将介绍android中可用的传感器,并且如何用传感器管理器监视它们。


# 使用传感器和传感器管理器


传感器管理器用于管理android 设备上可用的硬件传感器,使用方法如下:

你并不会直接与传感器硬件交互,而是需要使用Sensor对象。Sensor对象描述了它代表的硬件传感器属性,包括传感器类型,名称,制造商,etc


sensor中还定义了一组常量,用于描述传感器类型,如下:

一如图中  第一个为光传感器,返回一个lux为单位的值,用于描述光的亮度。光传感器通常用于动态控制屏幕的亮度,其他类型可由读者自己阅读文档



# 虚拟传感器

通常,android传感器是彼此独立的工作的,每个传感器报告特定硬件得到的结果,而不应用任何过滤或者平滑处理。在一些情况中,使用虚拟传感器很有帮助,因为它们可以提供简化的,经过矫正的或者符合的数据,使用它们更易于在一些应用中使用


# 查找传感器

                SensorManager sensorManager = (SensorManager)                        getSystemService(Context.SENSOR_SERVICE);                List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);                for(int i = 0;i < sensors.size();++i) {                    Log.d(TAG, sensors.get(i).getName());                }

# 返回特定的传感器

                Sensor sensor = m_sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);                if(sensor != null){                    float power = sensor.getPower();                    Log.d(TAG,sensor.getName() + "$power$" + power);                }

如果所求传感器不存在 那么就会返回一个空指针

其中 sensor可以获得传感器一些相关参数

比如耗电量 最大工作范围之类的


# 监视传感器

为监视一个传感器,需要使用SensorEventListener

使用onSensorChanged方法监视传感器值。使用onAccuracyChanged方法相应传感器精度的变化

如下

其中对于onSensorChanged参数SensorEvent有四种用于描述一个传感器事件的属性:

第一个表示精确度(low,medium,high,unreliable)

第二个表示触发该事件的传感器对象

第三个表示传感器事件发生的事件,以纳秒为单位

第四个表示以检测到的新值的浮点类型数组,其含义后做表示


在onAccuracyChanged中,第二个参数表示传感器的精确度,其值可以为如下的常量

使用方式:


                Sensor sensor = m_sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);                if(sensor == null) return;                m_sensorManager.registerListener(                        m_sensorEventListener,                        sensor,                        SensorManager.SENSOR_DELAY_NORMAL                );

其中第三个为响应速度,android提供了很多个可供你选择的更新速率,为一下常量:

值得注意的是我们还是需要在应用程序不需要接受更新的时候,注销其监听器

比较好的做法就是在activity的onResume中注册,在onPause中进行注销


    @Override    public void onPause(){        super.onPause();                m_sensorManager.unregisterListener(m_sensorEventListener);    }

# 解释传感器值

文档很清楚 不需我在解释,一如在加速度传感器中 0 1 2 分别代表 x y z 的加速度

以此类推

0 0