Sensors Overview
大多数Android手机都内置了用于测量运动,方向和各种环境条件的传感器。这些传感器能够提供原始数据具有较高的精度和准确度的,如果你想监控三维设备移动或定位是有用的,或者你想要监控的设备附近周围环境的变化。例如,一个游戏可以跟踪从设备的重力传感器读数来推测复杂的用户手势和动作,比如倾斜,摇动,旋转或摇摆。同样,天气应用程序可以使用设备的温度传感器和湿度传感器计算和报告露点或旅游应用程序可能使用的地磁传感器和加速度计报告罗盘方位。
Android平台支持的传感器三大类:
运动传感器
这些传感器测量加速力,并沿三个轴的旋转力。此类别包括加速度计,重力感应器,陀螺仪和旋转矢量传感器。
环境传感器
这些传感器测量各种环境参数,例如环境空气温度和压力,照明和湿度。此类别包括气压计,光度计,和温度计。
位置传感器
这些传感器测量设备的物理位置。这个类别包括方向传感器和磁力计。
您可以访问设备上可用的传感器,并采用了Android传感器框架获取原始传感器数据。该传感器框架提供了几个类和服务,帮助您执行各种各样的传感器相关的任务的接口。例如,你可以用传感器框架来做到以下几点:
确定哪些传感器可在设备上。
确定个体传感器的功能,例如其最大范围,生产商,功率要求,和分辨率。
获取原始传感器数据和定义在此你获得传感器数据的最低费率。
注册和注销传感器事件侦听器监视传感器的变化。
本主题提供了可用的Android平台上的传感器的概述。它还提供了一个介绍了传感器框架。
简介传感器
Android的传感器框架,您可以访问多种类型的传感器。一些这些传感器是基于硬件的,有些是基于软件的。基于硬件的传感器是内置到手机或平板电脑设备的物理部件。它们通过直接测量特定的环境属性,例如加速度,磁场强度或角度变化导出其数据。基于软件的传感器是不物理设备,虽然它们模仿基于硬件的传感器。基于软件的传感器从一个或多个基于硬件的传感器获得它们的数据,有时也称为虚拟传感器的或合成的传感器。线性加速度传感器和重力传感器是基于软件的传感器的例子。表1总结了由Android平台所支持的传感器。
很少有Android系统的设备有每一种类型的传感器。例如,大多数手持设备和片剂具有加速计和磁力计,但更少的设备有气压计或温度计。此外,设备可以具有一个给定类型的多个传感器。例如,设备可以具有两个重力传感器,每一个具有不同的范围。
通过Android平台支持表1.传感器类型。
传感器类型说明常见用途
TYPE_ACCELEROMETER硬件措施施加到一个设备上的所有三个物理轴(x,y和z),其中包括在重力的作用的加速力在米/秒2。运动检测(晃动,倾斜等)。
TYPE_AMBIENT_TEMPERATURE硬件措施环境室温为摄氏度(℃)。请参见下面的注意。监测空气温度。
TYPE_GRAVITY软件或硬件措施施加到一个设备上的所有三个物理轴(x,Y,Z)的重力在米/秒2的力。运动检测(晃动,倾斜等)。
TYPE_GYROSCOPE硬件措施弧度/秒左右各三个物理轴(x,y和z)的旋转设备的速率。旋转检测(旋转,转等)。
TYPE_LIGHT硬件措施LX环境亮度(照度)。控制屏幕亮度。
TYPE_LINEAR_ACCELERATION软件或硬件措施施加到一个设备上的所有三个物理轴(x,y和z)的加速力在米/秒2,但不包括在重力的作用。沿一个轴监测加速度。
TYPE_MAGNETIC_FIELD硬件措施周围地磁场在μT所有三个物理轴(x,Y,Z)。创建一个指南针。
TYPE_ORIENTATION软件措施度,一个装置使周围的所有三个物理轴(x,Y,Z)的旋转。如API级别3的可以使用的重力传感器,并与所述getRotationMatrix()方法一起使用时的地磁传感器获得用于一个设备的倾斜矩阵和旋转矩阵。确定设备位置。
TYPE_PRESSURE硬件措施百帕或毫巴环境空气压力。监测空气压力的变化。
TYPE_PROXIMITY硬件测量物体在相对于装置的视图屏幕厘米的接近。这种传感器通常用于确定手机是否被举起到一个人的耳朵。在通话过程中手机的位置。
TYPE_RELATIVE_HUMIDITY硬件措施以百分比的相对环境湿度(%)。监视露点,绝对和相对湿度。
TYPE_ROTATION_VECTOR软件或硬件措施的装置的通过提供设备的旋转矢量的三个元素的定向。运动检测和旋转检测。
TYPE_TEMPERATURE硬件措施的设备以摄氏度的温度(℃)。该传感器实现跨设备不同而不同,这是传感器与API级别14监控温度传感器TYPE_AMBIENT_TEMPERATURE更换。
传感器框架
您可以访问这些传感器,并采用了Android传感器框架获取原始传感器数据。传感器框架是android.hardware包的一部分,并包括以下的类和接口:
的SensorManager
你可以使用这个类来创建传感器服务的实例。这个类提供了访问和上市传感器,注册和注销传感器事件侦听器,并获取方位信息的各种方法。此类还提供了用于报告传感器精度,集数据采集速率,和校准传感器,传感器的几个常数。
传感器
你可以使用这个类来创建特定的传感器的一个实例。这个类提供了让你确定传感器的功能的各种方法。
SensorEvent
该系统使用这个类来创建一个传感器事件对象,它提供了关于传感器事件的信息。传感器事件对象包括以下信息:所述原始传感器数据,传感器生成事件时,数据的准确性,并且该事件的时间标记的类型。
SensorEventListener
您可以使用此接口来创建接收通知(传感器事件)两个回调方法时,传感器值的变化,或者当传感器精度变化。
在典型的应用中使用这些传感器相关的API执行两个基本任务:
识别传感器和传感器功能
如果你的应用程序依赖于特定的传感器类型或功能的功能在运行时识别传感器和传感器功能是非常有用的。例如,您可能需要确定所有存在设备上的传感器和禁用依赖于中不存在任何的传感器应用程序功能。同样的,你可能要识别所有给定类型的传感器,所以你可以选择有适合您应用的最佳性能,传感器的实现。
监控传感器事件
监测传感器的事件是你如何获取原始传感器数据。传感器每次事件发生的传感器检测到它是测量的参数发生变化时。传感器事件提供了四个部分信息:触发事件,时间戳的事件,事件的准确度,并且触发事件的原始传感器数据的传感器的名称。
传感器可用性
而传感器的可用性从设备而异的装置,它也可以的Android版本之间变化。这是因为,在Android传感器已经引入在几个平台释放过程。例如,许多传感器的Android 1.5(API等级3)进行了介绍,但有些人不执行,是不能使用,直到的Android 2.3(API等级9)。同样,几个传感器的Android 2.3(API等级9)和Android 4.0(API等级14)进行了介绍。两个传感器已过时和更新,更好的传感器所取代。
表2总结在一个平台上逐平台基础每个传感器的可用性。只有四个平台上市,因为这些是涉及到传感器的变化的平台。被列为不推荐使用的传感器仍然可以在随后的平台(提供的传感器存在的设备上),这与Android的向前兼容性政策。
表2.传感器可用性因平台。
传感器框架
您可以访问这些传感器,并采用了Android传感器框架获取原始传感器数据。传感器框架是android.hardware包的一部分,并包括以下的类和接口:
的的SensorManager
你可以使用这个类来创建传感器服务的实例。这个类提供了访问和上市传感器,注册和注销传感器事件侦听器,并获取方位信息的各种方法。此类还提供了用于报告传感器精度,集数据采集速率,和校准传感器,传感器的几个常数。
传感器
你可以使用这个类来创建特定的传感器的一个实例。这个类提供了让你确定传感器的功能的各种方法。
SensorEvent
该系统使用这个类来创建一个传感器事件对象,它提供了关于传感器事件的信息。传感器事件对象包括以下信息:所述原始传感器数据,传感器生成事件时,数据的准确性,并且该事件的时间标记的类型。
SensorEventListener
您可以使用此接口来创建接收通知(传感器事件)两个回调方法时,传感器值的变化,或者当传感器精度变化。
在典型的应用中使用这些传感器相关的API执行两个基本任务:
识别传感器和传感器功能
如果你的应用程序依赖于特定的传感器类型或功能的功能在运行时识别传感器和传感器功能是非常有用的。例如,您可能需要确定所有存在设备上的传感器和禁用依赖于中不存在任何的传感器应用程序功能。同样的,你可能要识别所有给定类型的传感器,所以你可以选择有适合您应用的最佳性能,传感器的实现。
监控传感器事件
监测传感器的事件是你如何获取原始传感器数据。传感器每次事件发生的传感器检测到它是测量的参数发生变化时。传感器事件提供了四个部分信息:触发事件,时间戳的事件,事件的准确度,并且触发事件的原始传感器数据的传感器的名称。
传感器可用性
而传感器的可用性从设备而异的装置,它也可以的Android版本之间变化。这是因为,在Android传感器已经引入在几个平台释放过程。例如,许多传感器的Android 1.5(API等级3)进行了介绍,但有些人不执行,是不能使用,直到的Android 2.3(API等级9)。同样,几个传感器的OID的Andr 2.3(API等级9)和Android版4.0(API等级14)进行了介绍。两个传感器已过时和更新,更好的传感器所取代。
表2总结在一个平台上逐平台基础每个传感器的可用性。只有四个平台上市,因为这些是涉及到传感器的变化的平台。被列为不推荐使用的传感器仍然可以在随后的平台(提供的传感器存在的设备上),这与Android的向前兼容性政策。
表2.传感器可用性因平台。
Sensor | Android 4.0 (API Level 14) |
Android 2.3 (API Level 9) |
Android 2.2 (API Level 8) |
Android 1.5 (API Level 3) |
---|---|---|---|---|
TYPE_ACCELEROMETER |
Yes | Yes | Yes | Yes |
TYPE_AMBIENT_TEMPERATURE |
Yes | n/a | n/a | n/a |
TYPE_GRAVITY |
Yes | Yes | n/a | n/a |
TYPE_GYROSCOPE |
Yes | Yes | n/a1 | n/a1 |
TYPE_LIGHT |
Yes | Yes | Yes | Yes |
TYPE_LINEAR_ACCELERATION |
Yes | Yes | n/a | n/a |
TYPE_MAGNETIC_FIELD |
Yes | Yes | Yes | Yes |
TYPE_ORIENTATION |
Yes2 | Yes2 | Yes2 | Yes |
TYPE_PRESSURE |
Yes | Yes | n/a1 | n/a1 |
TYPE_PROXIMITY |
Yes | Yes | Yes | Yes |
TYPE_RELATIVE_HUMIDITY |
Yes | n/a | n/a | n/a |
TYPE_ROTATION_VECTOR |
Yes | Yes | n/a | n/a |
TYPE_TEMPERATURE |
Yes2 | Yes | Yes | Yes |
private SensorManager mSensorManager; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);接下来,您可以通过调用getSensorList()方法,并使用TYPE_ALL不断得到一个设备上的每个传感器的列表。 例如:
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);如果要列出所有给定类型的传感器,可以使用另外一个常量而不是TYPE_ALL如TYPE_GYROSCOPE,TYPE_LINEAR_ACCELERATION或TYPE_GRAVITY。
private SensorManager mSensorManager; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){ // Success! There's a magnetometer. } else { // Failure! No magnetometer. }注意:Android不要求设备制造商建立任何特定类型的传感器到他们的Android设备,因此设备可以有多种传感器的配置。
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ List<Sensor> gravSensors = mSensorManager.getSensorList(Sensor.TYPE_GRAVITY); for(int i=0; i<gravSensors.size(); i++) { if ((gravSensors.get(i).getVendor().contains("Google Inc.")) && (gravSensors.get(i).getVersion() == 3)){ // Use the version 3 gravity sensor. mSensor = gravSensors.get(i); } } } else{ // Use the accelerometer. if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } else{ // Sorry, there are no accelerometers on your device. // You can't play this game. } }另一种有用的方法是getMinDelay()方法,后者返回的最小时间间隔(以微秒为单位)的传感器可以用来感测数据。 ,对于getMinDelay()方法返回一非零值的任何传感器是流传感器。流传感器感知定期数据,并在Android 2.3的(API等级9)进行了介绍。如果当你调用getMinDelay()方法的传感器返回零,这意味着传感器不是流传感器,因为它报告的数据只有当它被感测参数的变化。
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()回调方法应用程序的时间间隔。缺省数据延迟是适用于监测典型的屏幕取向的改变,并且使用20微秒的延迟。您可以指定其他数据的延迟,如SENSOR_DELAY_GAME(20,000微秒延迟),SENSOR_DELAY_UI(60,000微秒延迟),或SENSOR_DELAY_FASTEST(0微秒延迟)。由于Android 3.0(API等级11),你还可以指定延迟的绝对值(微秒)。
private SensorManager mSensorManager; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){ // Success! There's a pressure sensor. } else { // Failure! No pressure sensor. }使用谷歌播放器,以针对特定的传感器配置
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />如果添加这个元素和描述符到应用程序的清单,用户将看到您的谷歌应用程序只玩,如果他们的设备有一个加速度计。
private SensorManager mSensorManager; ... @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); }欲了解更多信息,请参阅unregisterListener(SensorEventListener)。