传感器
Android 传感器框架 支持各种传感器类型来测量物理环境的条件并从应用程序读取原始数据。使用传感器驱动程序,您的应用程序可以扩展此框架,并添加通过 外设 I/O 连接的新传感器设备。
来自这些传感器的数据通过与内置Android传感器相同的 SensorManager APIs进行传送。您的应用程序可以实现驱动程序来连接已知类型的新传感器,例如加速度计,或Android目前未定义的传感器类型,如血糖传感器。
实现驱动
当监听器注册传感器更新时,该框架会定期轮询您的驱动程序。要响应新数据的轮询请求,请扩展 UserSensorDriver
类并覆盖 read()
方法。每次调用读取应返回包含当前传感器数据的新 UserSensorReading
。
当驱动程序无法生成传感器读数时,框架可能会调用 read()
。当这种情况发生时,您的驱动程序应该抛出一个 IOException
。
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
来声明传感器的类型。
对于大多数应用,传感器类型应该与Android现有的已知 Sensor 类型中的一样。
</li>提供驱动程序的传感器名称和供应商名称。
</li>使用 setDriver()
法附加您的 UserSensorDriver
实现。
UserSensor accelerometer = UserSensor.builder()
.setName("GroveAccelerometer")
.setVendor("Seeed")
.setType(Sensor.TYPE_ACCELEROMETER)
.setDriver(mDriver)
.build();
当实现Android没有定义类型的传感器时:
-
在构建器中用
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 class SensorDriverService extends Service {
UserSensor mAccelerometer;
@Override
public void onCreate() {
super.onCreate();
...
UserDriverManager manager = UserDriverManager.getManager();
// Create a new driver implementation
mAccelerometer = ...;
// Register the new driver with the framework
manager.registerSensor(mAccelerometer);
}
@Override
public void onDestroy() {
super.onDestroy();
...
UserDriverManager manager = UserDriverManager.getManager();
// Unregister the driver when finished
manager.unregisterSensor(mAccelerometer);
}
}
使用驱动程序正确注册,应用程序可以使用现有的Android 传感器框架服务 从相关设备接收更新。 .
在传感器可用于客户端之前,注册过程可能需要一些时间。对用户感应器感兴趣的应用程序应注册一个 DynamicSensorCallback,以便在注册传感器读数的监听器之前通知它们。
public class SensorDriverService extends Service implements SensorEventListener {
private SensorManager mSensorManager;
@Override
public void onCreate() {
super.onCreate();
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerDynamicSensorCallback(new SensorCallback());
}
@Override
public void onSensorChanged(SensorEvent event) {
...
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
...
}
// Listen for registration events from the sensor driver
private class SensorCallback extends SensorManager.DynamicSensorCallback {
@Override
public void onDynamicSensorConnected(Sensor sensor) {
Log.i(TAG, sensor.getName() + " has been connected");
// Begin listening for sensor readings
mSensorManager.registerListener(SensorDriverService.this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onDynamicSensorDisconnected(Sensor sensor) {
Log.i(TAG, sensor.getName() + " has been disconnected");
// Stop receiving sensor readings
mSensorManager.unregisterListener(SensorDriverService.this);
}
}
}