SensorsController 支持对以下两种情形的处理和开发。
注意:本处使用心率设备进行说明,如果是采集步数,可以直接跳到 8 添加监听。
// 创建一个SensorsController 对象用于获取数据
private SensorsController mSensorsController;
// 创建一个BleController 对象用于扫描远端蓝牙设备
private BleController mBleController;
// 创建一个BleDeviceInfo 对象用于临时保存扫描的设备
private BleDeviceInfo mBleDeviceInfo;
// 创建一个DataCollector 对象用于临时保存远端蓝牙设备
private DataCollector mDataCollector;
public void getSensorController(View view) {
HiHealthOptions options = HiHealthOptions.builder().build();
// 登录华为ID
AuthHuaweiId signInHuaweiId = HuaweiIdAuthManager.getExtendedAuthResult(options);
// 获取SensorsController 和BleController
mSensorsController = HuaweiHiHealth.getSensorsController(this, signInHuaweiId);
mBleController = HuaweiHiHealth.getBleController(this, signInHuaweiId);
} // 开始扫描具有心率功能的蓝牙设备,支持传入多个数据类型,扫描多种设备,扫描时间设置为5秒钟
Task<Void> response = mBleController.beginScan(Arrays.asList(DataType.DT_INSTANTANEOUS_HEART_RATE), 5, new BleScanCallback() {
@Override
public void onDeviceDiscover(BleDeviceInfo device) {
// 扫描到匹配的蓝牙设备自动回调,bleDeviceInfo 对象即为扫描到的设备,此处将设备的名称在日志中打印出来
Log.i("Sensor","Discovered device " + device.getDeviceName());+
// 保存扫描到的设备信息
mBleDeviceInfo = device;
}
@Override
public void onScanEnd() {
// 扫描结束回调
Log.i("Sensor","onScanEnd is called ");
}
}); // 手动停止蓝牙扫描
public void stopScanning(View view) {
mBleController.endScan(mBleCallback);
} 为了让 SensorsController 使用设备,建议先保存该设备,使用 BleController.saveDevice 方法。
public void saveDevices(View view) {
// 将前面扫描到的设备保存
mBleController.saveDevice(mBleDeviceInfo);
} 成功保存该设备后,通过 SensorsController 获取该设备的数据采集器对象,例如:SensorsController.getDataCollectors 方法。
如果不再使用某个低功耗设备,可以使用 BleController.deleteDevice 方法对其进行删除。
public void deleteDevices(View view) {
// 将设备信息从保存的列表中删除
mBleController.deleteDevice(mBleDeviceInfo);
} 列出所有已经保存的蓝牙远端设备。
public void listMatchedDevices(View view) {
Task<List<BleDeviceInfo>> bleDeviceInfoTask = mBleController.getSavedDevices();
bleDeviceInfoTask.addOnSuccessListener(new OnSuccessListener<List<BleDeviceInfo>>() {
@Override
public void onSuccess(List<BleDeviceInfo> bleDeviceInfos) {
// bleDeviceInfos 为保存的设备列表
for (BleDeviceInfo bleDeviceInfo : bleDeviceInfos) {
// 将设备列表打印在日志里
Log.i("Sensor", "Matched BLE devices:" + bleDeviceInfo.getDeviceName());
}
}
});
} 获取所有已保存的数据采集器,使用 SensorsController.getDataCollectors 方法。
public void findDataCollectors(View view) {
// 构建一个DataCollectorsOptions 将要找的设备类型传入,此处为心率设备
DataCollectorsOptions dataCollectorsOptions =
new DataCollectorsOptions.Builder().setDataTypes(DataType.DT_INSTANTANEOUS_HEART_RATE).build();
// 将 dataSourcesRequest 作为参数,返回可用的心率设备
mSensorsController.getDataCollectors(dataCollectorsOptions)
.addOnSuccessListener(new OnSuccessListener<List<DataCollector>>() {
@Override
public void onSuccess(List<DataCollector> dataCollectors) {
// dataCollectors 就是返回的可用数据采集器
for (DataCollector dataCollector : dataCollectors) {
Log.i("Sensor", "Available data collector:" + dataCollector.getDataCollectorName());
// 将心率数据采集器保存,后面注册监听器时用
mDataCollector = dataCollector;
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {Log.i("findDataCollectors failed... ");
}
});
} 添加监听去接收特定数据采集器上报的原始数据,使用 SensorsController.register 方法。
/**
* 创建一个心率监听器的对象,接收的心率数据回调到onSamplePoint里
*/
private OnSamplePointListener heartrateListener = new OnSamplePointListener() {
@Override
public void onSamplePoint(SamplePoint dataPoint) {
// 将获取到的心率数据打印到日志里
Log.i("Sensor", "Heart rate received " + dataPoint.getFieldValue(Field.FIELD_BPM).toString());
}
};
public void registerHeartRate(View view) {
mSensorsController.register(
// 构建一个SensorsOptions 对象将数据类型、数据采集器、采样率等配置传入,数据类型为必填项
new SensorOptions.Builder().setDataType(DataType.DT_INSTANTANEOUS_HEART_RATE)
.setDataCollector(mDataCollector)
// 采样率设置为1秒
.setCollectionRate(1, TimeUnit.SECONDS)
.build(),
heartrateListener);
} 当不再需要接收实时上报的数据时,可以使用 SensorsController.unregister 方法取消注册的监听。
public void unregisterHeartRate(View view) {
// 把要取消的监听器对象传入
mSensorsController.unregister(heartrateListener);
}