Android API Guides---Sensors Overview

Sensors Overview

大多数Android手机都内置了用于测量运动,方向和各种环境条件的传感器。这些传感器能够提供原始数据具有较高的精度和准确度的,如果你想监控三维设备移动或定位是有用的,或者你想要监控的设备附近周围环境的变化。例如,一个游戏可以跟踪从设备的重力传感器读数来推测复杂的用户手势和动作,比如倾斜,摇动,旋转或摇摆。同样,天气应用程序可以使用设备的温度传感器和湿度传感器计算和报告露点或旅游应用程序可能使用的地磁传感器和加速度计报告罗盘方位。


Android平台支持的传感器三大类:


运动传感器
这些传感器测量加速力,并沿三个轴的旋转力。此类别包括加速度计,重力感应器,陀螺仪和旋转矢量传感器。
环境传感器
这些传感器测量各种环境参数,例如环境空气温度和压力,照明和湿度。此类别包括气压计,光度计,和温度计。
位置传感器
这些传感器测量设备的物理位置。这个类别包括方向传感器和磁力计。
您可以访问设备上可用的传感器,并采用了Android传感器框架获取原始传感器数据。该传感器框架提供了几个类和服务,帮助您执行各种各样的传感器相关的任务的接口。例如,你可以用传感器框架来做到以下几点:


确定哪些传感器可在设备上。
确定个体传感器的功能,例如其最大范围,生产商,功率要求,和分辨率。
获取原始传感器数据和定义在此你获得传感器数据的最低费率。
注册和注销传感器事件侦听器监视传感器的变化。
本主题提供了可用的Andr​​oid平台上的传感器的概述。它还提供了一个介绍了传感器框架。


简介传感器


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执行两个基本任务:


识别传感器和传感器功能
如果你的应用程序依赖于特定的传感器类型或功能的功能在运行时识别传感器和传感器功能是非常有用的。例如,您可能需要确定所有存在设备上的传感器和禁用依赖于中不存在任何的传感器应用程序功能。同样的,你可能要识别所有给定类型的传感器,所以你可以选择有适合您应用的最佳性能,传感器的实现。
监控传感器事件
监测传感器的事件是你如何获取原始传感器数据。传感器每次事件发生的传感器检测到它是测量的参数发生变化时。传感器事件提供了四个部分信息:触发事件,时间戳的事件,事件的准确度,并且触发事件的原始传感器数据的传感器的名称。
传感器可用性


而传感器的可用性从设备而异的装置,它也可以的Andr​​oid版本之间变化。这是因为,在Android传感器已经引入在几个平台释放过程。例如,许多传感器的Andr​​oid 1.5(API等级3)进行了介绍,但有些人不执行,是不能使用,直到的Andr​​oid 2.3(API等级9)。同样,几个传感器的Andr​​oid 2.3(API等级9)和Android 4.0(API等级14)进行了介绍。两个传感器已过时和更新,更好的传感器所取代。


表2总结在一个平台上逐平台基础每个传感器的可用性。只有四个平台上市,因为这些是涉及到传感器的变化的平台。被列为不推荐使用的传感器仍然可以在随后的平台(提供的传感器存在的设备上),这与Android的向前兼容性政策。


表2.传感器可用性因平台。

传感器框架


您可以访问这些传感器,并采用了Android传感器框架获取原始传感器数据。传感器框架是android.hardware包的一部分,并包括以下的类和接口:


的的SensorManager
你可以使用这个类来创建传感器服务的实例。这个类提供了访问和上市传感器,注册和注销传感器事件侦听器,并获取方位信息的各种方法。此类还提供了用于报告传感器精度,集数据采集速率,和校准传感器,传感器的几个常数。
传感器
你可以使用这个类来创建特定的传感器的一个实例。这个类提供了让你确定传感器的功能的各种方法。
SensorEvent
该系统使用这个类来创建一个传感器事件对象,它提供了关于传感器事件的信息。传感器事件对象包括以下信息:所述原始传感器数据,传感器生成事件时,数据的准确性,并且该事件的时间标记的类型。
SensorEventListener
您可以使用此接口来创建接收通知(传感器事件)两个回调方法时,传感器值的变化,或者当传感器精度变化。
在典型的应用中使用这些传感器相关的API执行两个基本任务:


识别传感器和传感器功能
如果你的应用程序依赖于特定的传感器类型或功能的功能在运行时识别传感器和传感器功能是非常有用的。例如,您可能需要确定所有存在设备上的传感器和禁用依赖于中不存在任何的传感器应用程序功能。同样的,你可能要识别所有给定类型的传感器,所以你可以选择有适合您应用的最佳性能,传感器的实现。
监控传感器事件
监测传感器的事件是你如何获取原始传感器数据。传感器每次事件发生的传感器检测到它是测量的参数发生变化时。传感器事件提供了四个部分信息:触发事件,时间戳的事件,事件的准确度,并且触发事件的原始传感器数据的传感器的名称。
传感器可用性


而传感器的可用性从设备而异的装置,它也可以的Andr​​oid版本之间变化。这是因为,在Android传感器已经引入在几个平台释放过程。例如,许多传感器的Andr​​oid 1.5(API等级3)进行了介绍,但有些人不执行,是不能使用,直到的Andr​​oid 2.3(API等级9)。同样,几个传感器的OID的Andr​​ 2.3(API等级9)和Android版4.0(API等级14)进行了介绍。两个传感器已过时和更新,更好的传感器所取代。


表2总结在一个平台上逐平台基础每个传感器的可用性。只有四个平台上市,因为这些是涉及到传感器的变化的平台。被列为不推荐使用的传感器仍然可以在随后的平台(提供的传感器存在的设备上),这与Android的向前兼容性政策。


表2.传感器可用性因平台。

Table 2. Sensor availability by platform.

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

1此传感器类型是Android 1.5的(API等级3)补充,但它不能使用,直到的Android 2.3(API等级9)。


2该传感器可用,但它已被弃用。


识别传感器和传感器功能


Android的传感器框架提供了几种方法,可以很容易让你在运行时确定哪些传感器的设备上。 API还提供了让你确定每个传感器的功能,如它的最大范围内,它的分辨率,它的功率要求的方法。


要确定你首先需要获取到传感器服务的引用一个设备上的传感器。要做到这一点,您可以通过调用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_ALL如TYPE_GYROSCOPE,TYPE_LINEAR_ACCELERATION或TYPE_GRAVITY。


还可以决定是否通过使用getDefaultSensor()方法和传递的类型恒定为特定传感器的设备上是否存在传感器的特定类型。如果设备具有给定类型的多个传感器,所述传感器中的一个必须被指定为缺省传感器。如果默认传感器不为给定类型的传感器存在,该方法调用返回null,这意味着该装置不具有该类型的传感器。例如,下面的代码检查是否有一个装置上的磁力计:

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不要求设备制造商建立任何特定类型的传感器到他们的Andr​​oid设备,因此设备可以有多种传感器的配置。


除了列出那些设备上的传感器,可以使用传感器类的公共方法来确定的功能和各个传感器的属性。如果你希望你的应用程序,以在此基础上的传感器或传感器功能不同的行为都可以在设备上,这非常有用。例如,您可以使用getResolution()和getMaximumRange()方法来获取传感器的分辨率和测量的最大范围。您也可以使用getPower()方法来获取传感器的电源要求。


如果你想优化您的不同制造商的传感器或不同版本的传感器的应用程序的公共方法有两个是特别有用。例如,如果你的应用需要监控用户的手势,如倾斜和震动,你可以创建数据过滤规则一组和具有特定供应商的重力感应器更新的设备优化和另一套数据过滤规则和优化的设备不具有重力传感器和只有一个加速度计。下面的代码示例向您介绍如何使用getVendor()和getVersion()方法来做到这一点。在此示例中,我们正在寻找,列出谷歌公司作为供应商,并具有3版本号重力感应如果特定的传感器不存在设备上,我们尝试使用加速度计。

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()方法的传感器返回零,这意味着传感器不是流传感器,因为它报告的数据只有当它被感测参数的变化。


因为它可以让你确定在哪个传感器可采集数据的最大速率的getMinDelay()方法是有用的。如果您的应用程序的某些功能要求高数据采集速率或流传感器,就可以用这个方法来确定传感器是否符合这些要求,然后相应地启用或禁用应用程序中的相关功能。


注意:传感器的最大数据采集速率不一定在该传感器框架传感器数据传送到你的应用程序的速度。传感器框架报告中的数据通过传感器事件,和几个因素在影响您的应用程序接收到传感器事件的速率。有关详细信息,请参阅监视传感器活动。


监测传感器活动


要监视原始传感器数据,你需要实现通过SensorEventListener接口暴露两个回调方法:onAccuracyChanged()和onSensorChanged()。每当发生以下情况的Andr​​oid系统调用这些方法:


传感器的精度变化。
在这种情况下,系统将调用onAccuracyChanged()方法,为您提供到改变了传感器对象和传感器的新精度的参照。 SENSOR_STATUS_ACCURACY_LOW,SENSOR_STATUS_ACCURACY_MEDIUM,SENSOR_STATUS_ACCURACY_HIGH或SENSOR_STATUS_UNRELIABLE:精度由四个状态常量之一表示。
传感器报告一个新值。
在这种情况下,系统调用onSensorChanged()方法,为您提供一个SensorEvent对象。一个SensorEvent对象包含关于新的传感器数据的信息,包括:所述数据的准确度,即所产生的数据,在该生成的数据的时间戳,以及新的数据记录在传感器的传感器。
下面的代码演示了如何使用onSensorChanged()方法来监测来自光传感器的数据。本示例显示在在main.xml中文件sensor_data定义一个TextView原始传感器数据。

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),你还可以指定延迟的绝对值(微秒)。


您指定的延迟仅仅是一个建议的延迟。 Android系统和其他应用程序可以改变这种延迟。作为最佳实践,您应该指定你能因为系统通常使用超过您指定的一个较小的延迟(也就是说,你应该选择仍然满足您的应用需求最慢的采样率)最大延时。使用较大的延迟征收的处理器的负载较低,因此更省电。


目前,用于确定传感器框架发送传感器事件到应用程序的速度没有公开的方法;但是,您可以使用与每个传感器事件来计算几个事件的采样率相关联的时间戳。你不应该改变采样率(延时),一旦你设置它。如果由于某种原因你需要更改延迟,你将不得不注销并重新注册传感器侦听器。


同样重要的是要注意,此示例使用onResume()和的onPause()回调方法来注册和注销传感器事件侦听器。作为最佳实践,你应该始终禁用不需要的传感器,尤其是当你的活动已暂停。因为一些传感器具有实质性的功率要求,并会很快用完电池电量如果不这样做能排在短短几个小时的电池。屏幕关闭时,系统不会自动禁用传感器。


处理不同的传感器配置


Android不指定设备的标准传感器配置,这意味着设备制造商可以将任何传感器配置,他们希望到他们的Andr​​oid设备。其结果是,装置可包括在宽范围的配置的各种传感器。例如,摩托罗拉的Xoom具有压力传感器,但三星Nexus S没有。同样,Xoom的和歌Nexus S有陀​​螺仪,但是HTC的Nexus One没有。如果你的应用程序依赖于特定类型的传感器,你必须确保传感器存在的设备上,以便您的应用程序可以成功运行。你必须确保给定的传感器存在一个设备上的两个选项:


在运行时检测传感器,并启用或禁用应用程序功能为宜。
使用谷歌播放器瞄准特定的传感器配置设备。
每个选项在下面的章节中讨论。


在运行时检测传感器


如果应用程序使用特定类型的传感器,但不依赖于它,你可以使用传感器框架来检测传感器在运行时,然后禁用或启用应用程序功能为宜。例如,导航应用程序可能使用的温度传感器,压力传感器,GPS传感器,和地磁传感器,显示温度,气压,位置和方位。如果设备没有一个压力传感器,可以用传感器框架来检测没有在运行时的压力传感器,然后禁用显示压力应用程序的UI部分。例如,下面的代码检查是否有一个设备上的压力传感器:
 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.
  }
使用谷歌播放器,以针对特定的传感器配置


如果要发布的谷歌上播放的应用程序,你可以使用<用途特征>元素在你的manifest文件从没有为您的应用选择合适的传感器配置设备过滤应用程序。在<用途特征>元素具备多种硬件描述符,让你基于特定传感器的存在滤波器应用。你可以列出的传感器包括:加速计,气压计,指南针(地磁),陀螺仪,光线和距离。下面是一个例子清单项用于筛选不具有加速度计的应用程序:
<uses-feature android:name="android.hardware.sensor.accelerometer"
              android:required="true" />
如果添加这个元素和描述符到应用程序的清单,用户将看到您的谷歌应用程序只玩,如果他们的设备有一个加速度计。


你应该设置描述到Android:所需=“真”只有当你的应用程序完全依赖于一个特定的传感器。如果应用程序使用了一些功能的传感器,但仍然没有传感器运行时,你应该列出传感器在<使用特征>元素,但设置描述到Android:要求=“假”。这有助于确保设备可以安装你的应用程序,即使他们没有特定的传感器。这也可以帮助你跟踪你的应用程序使用功能的项目管理的最佳实践。请记住,如果你的应用程序使用一个特定的传感器,但仍然没有传感器运行,那么你应该能够检测到传感器在运行时禁用或启用应用程序功能为宜。


传感器坐标系


在一般情况下,在传感器框架使用一个标准的3轴的坐标系来表示的数据值。对于大多数传感器,当装置在其默认方位保持的坐标系统被定义相对于该设备的屏幕(参见图1)。当设备在其默认方向被保持,X轴是水平的,并指向右侧,Y轴是垂直的,并指出了,并朝向屏幕面的外侧的Z轴分。在这个系统中,在屏幕后面坐标具有负Z值。这个坐标系统被用于通过以下传感器:
如果添加这个元素和描述符到应用程序的清单,用户将看到您的谷歌应用程序只玩,如果他们的设备有一个加速度计。


你应该设置描述到Android:所需=“真”只有当你的应用程序完全依赖于一个特定的传感器。如果应用程序使用了一些功能的传感器,但仍然没有传感器运行时,你应该列出传感器在<使用特征>元素,但设置描述到Android:要求=“假”。这有助于确保设备可以安装你的应用程序,即使他们没有特定的传感器。这也可以帮助你跟踪你的应用程序使用功能的项目管理的最佳实践。请记住,如果你的应用程序使用一个特定的传感器,但仍然没有传感器运行,那么你应该能够检测到传感器在运行时禁用或启用应用程序功能为宜。


传感器坐标系


在一般情况下,在传感器框架使用一个标准的3轴的坐标系来表示的数据值。对于大多数传感器,当装置在其默认方位保持的坐标系统被定义相对于该设备的屏幕(参见图1)。当设备在其默认方向被保持,X轴是水平的,并指向右侧,Y轴是垂直的,并指出了,并朝向屏幕面的外侧的Z轴分。在这个系统中,在屏幕后面坐标具有负Z值。这个坐标系统被用于通过以下传感器:
  • Acceleration sensor
  • Gravity sensor
  • Gyroscope
  • Linear acceleration sensor
  • Geomagnetic field sensor
最重要的一点,了解有关该坐标系是,当设备的屏幕方向改变,也就是说,在传感器的坐标系永不改变的设备移动轴没有交换。此行为是相同的了OpenGL坐标系统的行为。


了解另一点是,您的应用程序不应该假设设备的自然(默认)方向为纵向。对于许多平板设备的自然方向为横向。和传感器坐标系统总是基于一个装置的自然取向。


最后,如​​果你的应用传感器数据相匹配,屏幕上显示,您需要使用getRotation()方法来确定屏幕旋转,然后使用remapCoordinateSystem()方法来MAP传感器坐标到屏幕坐标。你需要这样做,即使你的清单指定唯一的画像显示。


有关传感器的详细信息坐标系,包括如何处理屏幕旋转,看到一个屏幕有好报的信息。
Android API Guides---Sensors Overview_第1张图片
图1坐标系统(相对于设备)的使用的传感器API。
注意:一些传感器和方法使用的坐标系统,该系统是相对于参考世界帧(相对于参考设备的帧)。这些传感器和方法返回代表相对于地球设备运动或设备位置数据。欲了解更多信息,请参阅getOrientation()方法时,getRotationMatrix()方法,方向传感器和旋转矢量传感器。


最佳实践访问和使用传感器


当你设计你的传感器的实施,一定要遵循在本节讨论的指导方针。这些指南推荐用于谁在使用传感器框架来访问传感器并获取传感数据的人的最佳做法。


注销传感器监听器


一定要注销传感器监听器,当你正在使用的传感器或当传感器活动暂停进行。如果传感器侦听器已注册和活动被暂停,传感器将继续采集数据,除非您注销传感器使用电池资源。下面的代码演示了如何使用的onPause()方法来注销侦听:
private SensorManager mSensorManager;
  ...
@Override
protected void onPause() {
  super.onPause();
  mSensorManager.unregisterListener(this);
}
欲了解更多信息,请参阅unregisterListener(SensorEventListener)。


不要在模拟器上测试代码


目前,您不能在模拟器上测试传感器的代码,因为模拟器无法效仿传感器。您必须在物理设备上测试您的传感器代码。有,但是,传感器,模拟器,你可以用它来模拟传感器的输出。


不要挡住onSensorChanged()方法


传感器数据可以以高速率,这意味着该系统可以经常调用onSensorChanged(SensorEvent)方法改变。作为最佳实践,你应该做的尽可能少的onSensorChanged(SensorEvent)方法中,这样你就不会阻止它。如果应用程序需要你做的任何数据过滤或减少传感器的数据,你应该onSensorChanged(SensorEvent)方法之外执行这项工作。


避免使用过时的方法或传感器类型


有几个方法和常量已经过时。特别是TYPE_ORIENTATION传感器类型已被弃用。为了获得方位数据,你应该使用getOrientation()方法。同样,TYPE_TEMPERATURE传感器类型已被弃用。您应该使用TYPE_AMBIENT_TEMPERATURE传感器类型,而不是在运行Android 4.0的设备。


验证传感器在使用之前


始终验证设备上存在一个传感器尝试从中获取数据之前。不要以为因为它是一个频繁使用的传感器的传感器简单地存在。设备制造商不要求在他们的设备提供的任何特定的传感器。


请谨慎选择传感器延时


当您注册与registerListener()方法的传感器,一定要选择分娩率,是适合您的应用程序或用例。传感器可以以非常高的速率提供数据。使系统发送你不需要浪费系统资源和消耗电池电量的额外数据。

你可能感兴趣的:(Android API Guides---Sensors Overview)