传感器的坐标系统
通常情况,传感器框架使 用标准的3轴坐标系统来表达数据值。对于大多数传感器,坐标系统是相对与设备被保持在默认方向时的设备的屏幕来定义的(如图1)。当设备被保持在默认方向 时,X轴是水平向右、Y轴是垂直向上、Z轴是指向屏幕面板的外部。在这个系统中,背对着屏幕的Z轴坐标是负值。该坐标系统被下列传感器使用:
1.加速度传感器
2.重力传感器
3.陀螺仪
4.线性加速传感器
5.磁力仪
图1.传感器API使用的坐标系统。
要理解的最重要的一点是,在设备屏幕的方向发生变化时,坐标系统的各坐标轴不会发生变化,也就是说传感器的坐标系统不会因设备的移动而改变。这种行为与OpenGL坐标系统的行为相同。
另外要理解的一点是,应用程序不要假设设备的自然(默认)方向是纵向的。对于很多平板设备的自然方向是横向的。传感器坐标系统总基于设备的自然方向。
最后,如果你的应用程序 要把传感器的数据跟屏幕上的显示相匹配,那么就要使用getRotation()方法来判断屏幕的旋转性,然后使用 remapCoordinateSystem()方法把传感器坐标映射到屏幕的坐标上。即使在你的清单中指定了只是纵向显示,你也要这么做。
注意:有些传感器和方法使用的坐标系统是相对与全球参照系(不是设备参照系)。这些传感器和方法返回的数据是相对与地球的设备运动或设备位置。
访问和使用传感器的最佳实践
在你设计你的传感器实现时,要确保遵循以下讨论指南。这些指南是被推荐的使用传感器框架访问传感器和获取传感器数据的最佳实践。
注销传感器监听器
在使用完成传感器或传感器的Activity被挂起时,要确保注销传感器的监听器。如果被注册的传感器监听器和它的Activity被挂起,那么传感器还会继续获取数据,并消耗电池资源直到注销传感器。下列代码显示如何使用onPause()方法来注销监听器:
private SensorManager mSensorManager;
…
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
不要在模拟器上测试
因为模拟器不能够模拟传感器,所以目前还不能在模拟器上测试传感器代码。你必须在物理设备上测试你的传感器代码。但是传感器模拟器能够模拟传感器的输出。
不要阻塞onSensorChanged()方法
传感器数据能够高频率的 变化,这意味着系统会非常频繁的调用onSensorChanged(SensorEvent)方法。作为最佳实践,在 onSensorChanged(SensorEvent)方法中应该尽可能的少做事,以便不阻塞这个方法。如果应用程序需要进行数据过滤或减少传感器数 据,应该在onSensorChanged(SensorEvent)方法外来执行。
避免使用废弃的方法或传感器类型
有几个方法和常量已经被 废弃,尤其是TYPE_ORIENTATION传感器类型已经被废弃。应该使用getOrientation()方法来获取方向数据。同 样,TYPE_TEMPERATURE传感器类型也已经被废弃了。在运行Android4.0的设备上应用使用 TYPE_AMBIENT_TEMPERATURE传感器类型来替代。
在使用之前要确认传感器
在尝试从传感器上获取数据之前,要始终确认你所使用的传感器在设备上是否存在。不能因为是经常使用的传感器就简单的假设传感器是存在的。不要求设备制造商在他们的设备上提供任何特定的传感器。
仔细选择传感器的延迟
用registerListener()方法注册传感器时,一定要选择一个适应应用程序或应用场景的发送频率。传感器能够以很高的频率来提供数据。允许系统在不浪费系统资源和不使用电池供电的情况下发送额外的数据。