Truy cập dữ liệu cảm biến thô

API Cảm biến cho phép bạn đọc dữ liệu cảm biến thô trong ứng dụng theo thời gian thực. Hãy sử dụng API này để thực hiện những việc sau:

  • Liệt kê các nguồn dữ liệu có trên thiết bị và trên các thiết bị đồng hành.
  • Đăng ký trình nghe để nhận dữ liệu cảm biến thô.
  • Huỷ đăng ký trình nghe để không còn nhận được dữ liệu cảm biến thô nữa.

Liệt kê các nguồn dữ liệu có sẵn

Để lấy danh sách tất cả các nguồn dữ liệu có sẵn trên thiết bị và trên các thiết bị đồng hành, hãy sử dụng phương thức SensorsClient.findDataSources:

Kotlin

private val fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build()

// Note: Fitness.SensorsApi.findDataSources() requires the
// ACCESS_FINE_LOCATION permission.
Fitness.getSensorsClient(requireContext(), GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions))
    .findDataSources(
        DataSourcesRequest.Builder()
            .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA)
            .setDataSourceTypes(DataSource.TYPE_RAW)
            .build())
    .addOnSuccessListener { dataSources ->
        dataSources.forEach {
            Log.i(TAG, "Data source found: ${it.streamIdentifier}")
            Log.i(TAG, "Data Source type: ${it.dataType.name}")

            if (it.dataType == DataType.TYPE_STEP_COUNT_DELTA) {
                Log.i(TAG, "Data source for STEP_COUNT_DELTA found!")

                ...
            }
        }
    }
    .addOnFailureListener { e ->
        Log.e(TAG, "Find data sources request failed", e)
    }

Java

FitnessOptions fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build();

// Note: Fitness.SensorsApi.findDataSources() requires the
// ACCESS_FINE_LOCATION permission.
Fitness.getSensorsClient(getApplicationContext(), GoogleSignIn.getAccountForExtension(getApplicationContext(), fitnessOptions))
        .findDataSources(
                new DataSourcesRequest.Builder()
                        .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA)
                        .setDataSourceTypes(DataSource.TYPE_RAW)
                        .build())
        .addOnSuccessListener(dataSources -> {
            dataSources.forEach(dataSource -> {
                Log.i(TAG, "Data source found: ${it.streamIdentifier}");
                Log.i(TAG, "Data Source type: ${it.dataType.name}");

                if (dataSource.getDataType() == DataType.TYPE_STEP_COUNT_DELTA) {
                    Log.i(TAG, "Data source for STEP_COUNT_DELTA found!");
                    ...
                }
            })})
        .addOnFailureListener(e ->
            Log.e(TAG, "Find data sources request failed", e));

Để nhận thông tin về thiết bị cho một nguồn dữ liệu, hãy sử dụng phương thức DataSource.getDevice. Thông tin thiết bị rất hữu ích để phân biệt với các cảm biến tương tự trên các thiết bị khác nhau, hiển thị thông tin thiết bị từ cảm biến cho người dùng hoặc xử lý dữ liệu theo cách khác nhau tuỳ theo thiết bị. Ví dụ: có thể bạn muốn đọc dữ liệu cụ thể từ cảm biến trên thiết bị đeo chứ không phải từ cùng một loại cảm biến trên điện thoại.

Để nhận thực thể Device cho thiết bị đang chạy hoạt động của bạn, hãy sử dụng phương thức Device.getLocalDevice. Điều này rất hữu ích khi bạn muốn kiểm tra xem nguồn dữ liệu có nằm trên cùng một thiết bị mà ứng dụng của bạn đang chạy hay không.

Thêm trình nghe

Để thêm trình nghe nhận dữ liệu thô của một loại dữ liệu thể dục cụ thể hoặc từ một nguồn dữ liệu cụ thể, hãy sử dụng phương thức SensorsClient.add:

Kotlin

val listener = OnDataPointListener { dataPoint ->
        for (field in dataPoint.dataType.fields) {
            val value = dataPoint.getValue(field)
            Log.i(TAG, "Detected DataPoint field: ${field.name}")
            Log.i(TAG, "Detected DataPoint value: $value")
        }
    }

Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
    .add(
        SensorRequest.Builder()
            .setDataSource(dataSource) // Optional but recommended for custom
            // data sets.
            .setDataType(dataType) // Can't be omitted.
            .setSamplingRate(10, TimeUnit.SECONDS)
            .build(),
        listener
    )
    .addOnSuccessListener {
    	Log.i(TAG, "Listener registered!")
    }
    .addOnFailureListener {
    	Log.e(TAG, "Listener not registered.", task.exception)
    }

Java

OnDataPointListener listener = dataPoint -> {
    for (Field field : dataPoint.getDataType().getFields()) {
        Value value = dataPoint.getValue(field);
        Log.i(TAG, "Detected DataPoint field: ${field.getName()}");
        Log.i(TAG, "Detected DataPoint value: $value");
    }
};
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
        .add(
                new SensorRequest.Builder()
                        .setDataSource(dataSource) // Optional but recommended
                        // for custom data sets.
                        .setDataType(dataType) // Can't be omitted.
                        .setSamplingRate(10, TimeUnit.SECONDS)
                        .build(),
                listener
        )
        .addOnSuccessListener(unused ->
                Log.i(TAG, "Listener registered!"))
        .addOnFailureListener(task ->
    Log.e(TAG, "Listener not registered.", task.getCause()));
}

Xoá trình nghe

Để xoá trình nghe khỏi nội dung cập nhật dữ liệu thô, hãy sử dụng phương thức SensorsClient.remove:

Kotlin

Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
    .remove(listener)
    .addOnSuccessListener {
    	Log.i(TAG, "Listener was removed!")
    }
    .addOnFailureListener {
    	Log.i(TAG, "Listener was not removed.")
    }

Java

Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
        .remove(listener)
        .addOnSuccessListener(unused ->
                Log.i(TAG, "Listener was removed!"))
        .addOnFailureListener(e ->
                Log.i(TAG, "Listener was not removed."));