传感器
传感器目前已经成为了智能手机的标配。比较常见的传感器有:方向传感器、磁场传感器、温度传感器、光传感器、压力传感器、加速度传感器、重力传感器、陀螺仪传感器等。传感器就像一个个触手,不断采集着外部的信息,并将这些信息传送回手机进一步处理。在Android的特色开发技术中,除了基于位置的服务外,传感器技术绝对是最值得期待的技术。通过在Android应用中添加传感器,可以充分激发开发者的想象力,开发出各种新奇的程序。比如电子罗盘、水平仪,各种感知型游戏。
目前Android设备中可能出现的一些传感器类型包括:
上图为红米手机运行上述示例代码后的结果。每个item有三行文本,第一行为传感器名称,第二行为传感器类型,第三行为传感器的Vendor(即传感器提供商)。其中第二行的int值为传感器的类型,它是Sensor对象调用getType()方法的返回值。在Sensor类中定义了很多int型常量来表示传感器的类型。
表1 传感器类型
方法 |
说明 |
int TYPE_ACCELEROMETER = 1 |
三轴加速度传感器(返回三个坐标轴的加速度,单位m/s2) |
int TYPE_MAGNETIC_FIELD = 2 |
磁场传感器(返回三个坐标轴的数值,单位微特斯拉) |
int TYPE_ORIENTATION = 3 |
方向传感器(已过时,使用SensorManager.getOrientation()代替) |
int TYPE_GYROSCOPE = 4 |
陀螺仪传感器(可判断方向,返回三个坐标轴上的角度) |
int TYPE_LIGHT = 5 |
光线传感器(单位lux勒克斯) |
int TYPE_PRESSURE = 6 |
压力传感器(单位千帕斯卡) |
int TYPE_TEMPERATURE = 7 |
温度传感器(单位摄氏度,已过时,使用环境温度传感器代替) |
int TYPE_PROXIMITY = 8 |
距离传感器 |
int TYPE_GRAVITY = 9 |
重力传感器 |
int TYPE_LINEAR_ACCELERATION = 10 |
线性加速度传感器 |
int TYPE_ROTATION_VECTOR = 11 |
旋转矢量传感器 |
int TYPE_RELATIVE_HUMIDITY = 12 |
相对湿度传感器 |
int TYPE_AMBIENT_TEMPERATURE = 13 |
环境温度传感器 |
int TYPE_ALL = -1 |
列出所有传感器 |
在AndroidManifest.xml配置文件中,指定该应用程序只支持运行在具有哪些硬件功能的设备上。如果应用程序需要温度传感器,可以在配置文件中添加下面一行代码:
Android Market只将应用程序安装在有温度传感器的设备上。但是该规则并不适用于其他Android应用商店。也就是说,一些Android应用商店不会执行检测以确保将应用程序安装在支持指定传感器的设备上。
三、使用传感器的步骤
(一)、一般使用传感器都有以下5个通用步骤:
1、调用Context的getSystemService(Context.SENSOR_SERVICE)方法获取SensorManager对象;
2、调用SensorManager的getDefaultSensor(int type)方法获取指定类型的传感器;
3、在onCreate()生命周期方法中调用SensorManager的registerListener()方法为指定的传感器注册监听;
4、实例化SensorEventListener接口,作为registerListener()方法的第一个参数。重写SensorEventListener接口中onSensorChanged()方法;
5、在onDestroy()生命周期方法中调用SensorManager对象的unregisterListener()方法释放资源。
(二)、SensorManager的registerListener()方法的用法进行说明
public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate)
参数说明如下:
listener:监听传感器事件的监听器。该监听器需要实现SensorEventListener接口;
sensor:通过SensorManager的getDefaultSensor(int type)方法获取到的传感器对象;
rate:获取传感器数据的频率。该参数由SensorManager中的几个常量来定义。
1)int SENSOR_DELAY_FASTEST = 0;
以最快的速度获得传感器数据。只有特别依赖传感器数据的应用才推荐采用这种频率。这种模式会造成手机电量大量耗费。
2)int SENSOR_DELAY_GAME = 1;
适合游戏的频率。在一般实时性要求的应用上适用这种频率。
3)int SENSOR_DELAY_UI = 2;
适合普通用户界面的频率。这种模式比较省电,系统开销也小,但是延迟较长。
4)int SENSOR_DELAY_NORMAL = 3;
正常频率。一般实时性要求不是特别高的应用上采用这种频率。
【注意:】
重写SensorEventListener接口中onSensorChanged(SensorEvent event)方法是实现传感器应用的关键。其中参数SensorEvent中有一个非常重要的属性:float[]类型的values数组。可以通过这个values数组取出传感器传回的数据。values数组长度为3,但不一定每一个数组元素都有意义,对于不同的传感器,每个数组元素的含义不同。
四、光传感器
光传感器的类型常量为Sensor.TYPE_LIGHT (数值为5)。values数组只有第一个元素values[0]有意义,表示光线的强度。
Android SDK中将光线强度分为不同等级,每一个等级的最大值由一个常量表示,这些常量定义在SensorManager类中。其中最大值为120000.0f。
public static final float LIGHT_SUNLIGHT_MAX = 120000.0f;//最强光线强度
public static final float LIGHT_SUNLIGHT= 110000.0f;//万里无云阳光直射的光线强度
public static final float LIGHT_SHADE = 20000.0f;//阳光被云遮挡后的光线强度
public static final float LIGHT_OVERCAST= 10000.0f;//多云时光线强度
public static final float LIGHT_SUNRISE= 400.0f;//刚日出时光线强度
public static final float LIGHT_CLOUDY = 100.0f;//阴天无太阳时光线强度
public static final float LIGHT_FULLMOON= 0.25f;//夜晚满月时光线强度
public static final float LIGHT_NO_MOON = 0.001f;//夜晚无月亮时光线强度