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 của mình theo thời gian thực. 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 để trình nghe không còn nhận được dữ liệu cảm biến thô.

Liệt kê 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 quảng cáo đồng hành thiết bị di động, hãy sử dụng SensorsClient.findDataSources phương thức:

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 DataSource.getDevice . Thông tin thiết bị rất hữu ích để phân biệt với cảm biến trên các thiết bị khác nhau, hiển thị thông tin thiết bị từ cảm biến đến hoặc xử lý dữ liệu theo cách khác nhau dựa trên thiết bị. Ví dụ: bạn có thể muốn đọc dữ liệu đặc biệt từ cảm biến trên thiết bị đeo nhưng không phải từ cùng một loại cảm biến trên điện thoại.

Cách nhận Device cho thiết bị đang chạy hoạt động của bạn, hãy sử dụng 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 thiết bị mà ứng dụng của bạn đang chạy trên đó.

Thêm trình nghe

Để thêm một 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 SensorsClient.add phương thức:

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á một trình nghe

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

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."));