安卓Sensor分类
Android平台支持三大类传感器:
1、动态传感器
这类传感器测量三个轴向上加速力和旋转力。这个类别中包含加速度计、重力传感器、陀螺仪和旋转矢量传感器。
2、环境传感器
这类传感器测量各种环境参数,如环境气温、气压、照度和湿度。这个类别中包含气压计、光度计和温度计。
3、位置传感器
这类传感器测量设备的物理位置。这个类别中包含屏幕方向传感器和磁力计。
传感器框架概览
安卓提供了一个传感器框架来访问设备上提供的传感器并获取原始数据。传感器框架提供多个类和接口,可用于执行各种与传感器相关的任务。例如可以使用传感器框架执行以下操作:
1、确定设备上有哪些传感器
2、确定单个传感器的特性,例如最大量程、制造商、功率要求和分辨率。
3、获取原始传感器数据并定义获取传感器数据的最低频率。
4、注册和取消注册用于监控传感器变化的传感器事件监听。
安卓支持的传感器
利用安卓的传感器框架,可以访问多种类型的传感器。有些传感器基于硬件,有些基于软件。基于硬件的传感器是内置在手机或平板设备中的物理组件。这类传感器通过直接测量特定的环境属性(如地磁场强度、角度变化或加速度)来采集数据。基于软件的传感器不是物理设备,它们只是模仿基于硬件的传感器。基于软件的传感器从一个或多个基于硬件的传感器获取数据,有时被称为虚拟传感器或合成传感器。比如重力传感器和线性加速度传感器就是基于软件的传感器。下表列出了安卓平台支持的传感器:

传感器框架
安卓传感器框架是androidd.hardwarer软件包的一部分,提供给应用开发者的类主要包含了以下类和接口:
SensorManager
使用该类来创建传感器服务的实例。该类提供了各种方法来访问和列出传感器,注册和取消注册传感器事件监听器,以及获取屏幕方向的信息。它还提供了几个传感器常量,用于报告传感器精确度,设置数据采集频率和校准传感器。它是一个抽象类,封装了一些传感器数据的交互函数和监听,其实现类为SystemSensorManager,对开发者不可见。
在安卓应用开发中,可以使用SensorManager及其相关接口来执行两个基本任务:
● 识别传感器和传感器特性
如果应用具有依赖于特定传感器类型或特性的功能,则在运行时识别传感器和传感器特性非常有用。例如,您可 能希望识别设备上的所有传感器,以便于停用依赖于不存在的传感器的应用功能。同样,您可能希望识别特定类型的所有传感器,以便选择可以为应用带来最佳性能的传感器实现。
下面代码示例为android传感器框架识别传感器和传感器特性的代码
private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
● 监控传感器事件
安卓应用开发者要实现监控原始传感器数据,需要实现两个通过SensorEventListener接口公开的回调方法:onAccuracyChanged()和onSensorChanged()。Android系统会在发生以下情况时调用这两个方法:
1.传感器的准确度发生了变化。
在这种情况下,系统会调用onAccuracyChange()方法,为开发者提供对于发生变化的Sensor对象的引用以及传感器的新准确度。准确度由以下 4 个状态常量之一表示:SENSOR_STATUS_ACCURACY_LOW、SENSOR_STATUS_ACCURACY_MEDIUM、SENSOR_STATUS_ACCURACY_HIGH 或 SENSOR_STATUS_UNRELIABLE。
2.传感器报告了新值
在这种情况下,系统会调用 onSensorChanged() 方法,为您提供 SensorEvent 对象。SensorEvent 对象包含关于新传感器数据的信息,包括:数据的准确度、生成数据的传感器、生成数据的时间戳以及传感器记录的新数据。
下面代码示例展示了使用onSensorChanged()方法监控光传感器的数据
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager sensorManager;
private Sensor mLight;
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = sensorManager.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();
sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
}
Sensor
您可以使用这个类来创建特定传感器的实例。该类提供了各种方法来确定传感器的特性。
SensorEvent
系统使用这个类来创建传感器事件对象,该对象提供有关传感器事件的信息。传感器事件对象中包含以下信息:原始传感器数据、生成事件的传感器类型、数据的准确度和事件的时间戳。
SensorEventListener
可以使用此接口创建两种回调方法,以在传感器值或传感器精确度发生变化时接收通知(传感器事件)。
传感器坐标系
一般,安卓的传感器框架使用标准的3轴坐标系来表示数据值。当设备处于默认屏幕方向时,会相对于设备屏幕来定义坐标系(参见图 1)。当设备处于默认屏幕方向时,X 轴为水平向右延伸,Y 轴为垂直向上延伸,Z 轴为垂直于屏幕向外延伸。在此坐标系中,屏幕后面的坐标将具有负 Z 值。以下传感器使用此坐标系:
Android传感器框架Java层类图
对安卓开放的传感器框架API的总结
安卓传感器框架封装了各种Sensor数据的复杂处理,其数据处理主要在Native层,在Java层通过SystemSensorManager中的Native方法,调用相关数据处理方法,统一抽象为Sensor类,根据不同的标记值在SensorManager中获取相应的Sensor实例,使用观察者模式提供SensorEventListener接口让应用开发者监听需要的传感器数据变化,变化上报的数据统一抽象为SensorEvent类,其宗旨就是:封装了复杂的数据处理,提供简单统一的接口给开发者。在鸿蒙系统多模输入的Sensor框架设计提供了很好的借鉴示例。主要有以下几点:
- 各种类型的传感器数据处理在Native层提供对应的类进行封装,数据处理转化为统一的数据(android的SensorEvent提供的就是一组Float数组)
- 使用观察者模式,提供公共的数据变化接口给应用层,这也是安卓Framwork层最经典的方案。
- 使用数值来标记各种传感器类型,将传感器统一封装为Sensor类,通过标记值来获取对应的传感器实例。
- 提前考虑鸿蒙系统中传感器的坐标轴的问题,当然最简单的还是和安卓系统的设计保持一致,但仍需考虑是否有更优方案。
网友评论