目录

SensorsController 开发

SensorsController 支持对以下两种情形的处理和开发。

注意:本处使用心率设备进行说明,如果是采集步数,可以直接跳到 8 添加监听。

1 通过登录华为帐号,获取 BleController 和 SensorsController 对象

   // 创建一个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);
}

2 扫描可用的低功耗蓝牙设备

扫描附近的低功耗蓝牙设备,可使用 BleController.beginScan 方法。
// 开始扫描具有心率功能的蓝牙设备,支持传入多个数据类型,扫描多种设备,扫描时间设置为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 ");
      }
});

3 停止扫描蓝牙设备

// 手动停止蓝牙扫描
public void stopScanning(View view) {
        mBleController.endScan(mBleCallback);
    }

4 保存设备

为了让 SensorsController 使用设备,建议先保存该设备,使用 BleController.saveDevice 方法。

 public void saveDevices(View view) {
        // 将前面扫描到的设备保存
        mBleController.saveDevice(mBleDeviceInfo);
    }

成功保存该设备后,通过 SensorsController 获取该设备的数据采集器对象,例如:SensorsController.getDataCollectors 方法。

5 删除设备

如果不再使用某个低功耗设备,可以使用 BleController.deleteDevice 方法对其进行删除。

    public void deleteDevices(View view) {
        // 将设备信息从保存的列表中删除
        mBleController.deleteDevice(mBleDeviceInfo);
    }

6 列出已保存的设备

列出所有已经保存的蓝牙远端设备。

    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());
                }
            }
        });
    }

7 获取设备数据采集器

获取所有已保存的数据采集器,使用 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... ");
                }
            });
    }

8 添加监听

添加监听去接收特定数据采集器上报的原始数据,使用 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);
            }

9 移除监听

当不再需要接收实时上报的数据时,可以使用 SensorsController.unregister 方法取消注册的监听。

public void unregisterHeartRate(View view) {
        // 把要取消的监听器对象传入
        mSensorsController.unregister(heartrateListener);
        }