一、传感器简介
Android传感器框架支持多种传感器类型来测量物理环境的状况,并且从应用程序读取原始数据。使用传感器驱动,你的应用可以扩展框架,并且添加新的通过Peripheral I/O连接的传感器设备;
和Android内置的传感器一样,来自这些传感器的数据通过相同的SensorManager API进行分发。你的应用可以实现一个驱动程序来连接一个已知类型的新传感器,如加速度计,或者一个Android目前没有定义的传感器类型,如血糖传感器。
二、使用步骤
要实现我们自己的传感器驱动,有如下步骤:
继承UserSensorDriver类并且覆盖read():
- 当监听器被注册用于传感器更新,框架定期轮询驱动程序。为了响应轮询请求新数据,继承UserSensorDriver类并且覆盖read()方法。每次调用读应该返回一个新的usersensorreading包含当前的传感器数据。
- 框架可能在驱动没有产生传感器读取数据的时候调用read()方法。当这个发生的时候,你的驱动将会抛出一个IOException。
注意: 更多关于已知传感器类型的数据格式信息,请查阅Sensor event values。
UserSensorDriver mDriver = new UserSensorDriver() { // Sensor data values float x, y, z; @Override public UserSensorReading read() { try { // ...read the sensor hardware... // Return a new reading return new UserSensorReading(new float[]{x, y, z}); } (catch Exception e) { // Error occurred reading the sensor hardware throw new IOException("Unable to read sensor"); } } };
- 如果您的传感器支持低功耗或睡眠模式,覆盖你的驱动实现的setEnabled()方法来激活它们。框架调用这个方法与为这传感器应该加紧提供读数,或者为节省电力而休眠;
UserSensorDriver mDriver = new UserSensorDriver() { ... // Called by the framework to toggle low power modes @Override public void setEnabled(boolean enabled) { if (enabled) { // Exit low power mode } else { // Enter low power mode } } };
注意:没有低功耗模式的传感器仍然可以使用此回调来增加或减少数据的报告频率以管理功耗;
描述传感器:
向Android框架添加一个新的传感器驱动:- 使用UserSensor.Builder来声明传感器的类型。对于大多数app,传感器类型应该匹配Android现有的已知传感器类型之一。
- 提供传感器名称和你的驱动供应商名称。
- 向Builder应用你的传感器的范围,分辨率,更新频率(延迟),和电源要求(如果有的话)。这些值将会帮助框架根据SensorManager接收到的请求选择最好的传感器。
- 使用setDriver()方法设置你的UserSensorDriver实现。
UserSensor accelerometer = UserSensor.builder() .setName("GroveAccelerometer") .setVendor("Seeed") .setType(Sensor.TYPE_ACCELEROMETER) .setDriver(mDriver) .build();
- 当实现了一个Android没有定义的传感器类型时:
- 在builder中使用setCustomType()替代setType();
- 提供一个数字传感器类型,是TYPE_DEVICE_PRIVATE_BASE或者更大;
- 包含一个传感器类型的唯一字符串名称。这个名字应该是系统范围唯一的,因此建议使用反向符号;
- 包含传感器的报告模式;
UserSensor custom = UserSensor.builder() .setName("MySensor") .setVendor("MyCompany") .setCustomType(Sensor.TYPE_DEVICE_PRIVATE_BASE, "com.example.mysensor", Sensor.REPORTING_MODE_CONTINUOUS) .setDriver(mDriver) .build();
注册传感器
- 通过使用UserDriverManager注册它,将你的新的传感器连接到框架上:
public