1

我有一个可穿戴设备,其中 Google Fit 与我的手机相同的帐户连接。wearOS 设备也连接到我的手机。

但是,以下代码不返回与数据点对应的数据源DataType.TYPE_HEIGHT, DataType.TYPE_HEART_RATE_BPM, DataType.TYPE_HEART_POINTS, DataType.TYPE_STEP_COUNT_DELTA



    private val fitnessOptions = FitnessOptions.builder()
        .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ)
        .addDataType(DataType.TYPE_HEART_POINTS, FitnessOptions.ACCESS_READ)
        .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
        .addDataType(DataType.TYPE_HEIGHT, FitnessOptions.ACCESS_READ)
        .build()
    
fun setUp() {
        val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestProfile()
            .requestScopes(Fitness.SCOPE_ACTIVITY_READ_WRITE, Fitness.SCOPE_BODY_READ_WRITE)
            .addExtension(fitnessOptions)
            .build()
        GoogleSignIn.getClient(activity, signInOptions).apply {
            activity.startActivityForResult(signInIntent, 1234)
        }
        account = GoogleSignIn.getAccountForExtension(activity, fitnessOptions)

    }

private fun findDataSources() {
        Fitness.getSensorsClient(activity, account)
            .findDataSources(
                DataSourcesRequest.Builder()
                    .setDataTypes(
                        DataType.TYPE_HEIGHT,
                        DataType.TYPE_HEART_RATE_BPM,
                        DataType.TYPE_HEART_POINTS,
                        DataType.TYPE_STEP_COUNT_DELTA,
                        DataType.TYPE_LOCATION_SAMPLE
                    )
                    .setDataSourceTypes(DataSource.TYPE_RAW)
                    .build()
            )
            .addOnSuccessListener { dataSources ->
                Timber.i("Play fitness $dataSources")
                dataSources.forEach {
                    Timber.i("Data source found: ${it.streamIdentifier}")
                    Timber.i("Data Source type: ${it.dataType.name}")
                    addSensorListener(it)
                }
            }
            .addOnFailureListener { e ->
                Timber.e(e)
            }
    }

    private fun addSensorListener(dataSource: DataSource) {
        val listener = OnDataPointListener { dataPoint ->
            for (field in dataPoint.dataType.fields) {
                val value = dataPoint.getValue(field)
                Timber.i("Detected DataPoint field: ${field.name}")
                Timber.i("Detected DataPoint value: $value")
            }
        }

        Fitness.getSensorsClient(activity, account)
            .add(
                SensorRequest.Builder()
                    .setDataSource(dataSource) // Optional but recommended for custom data sets.
                    .setDataType(dataSource.dataType) // Can't be omitted.
                    .setSamplingRate(10, TimeUnit.SECONDS)
                    .build(),
                listener
            )
            .addOnCompleteListener { task ->
                when (task.isSuccessful) {
                    true -> Timber.i("Listener registered!")
                    else -> Timber.e(task.exception)
                }
            }
    }

我确实得到了DataType.TYPE_LOCATION_SAMPLE我的手机的数据源。

我的 wearOS 设备是Fossil Gen 5 Carlyle

我在这里做错了什么?

4

2 回答 2

1

如果您在手机设备上安装“Android 健身 API”应用程序,您将无法获取手表设备的原始传感器,只能获取手机设备上的传感器。

官方文档中的描述让我们很困惑。我花了很多时间来调查这个。

这意味着“Fitness API for Android”中的“Raw Sensor”与 Android SDK 中的“SensorManager”相同。

于 2021-12-28T13:41:53.003 回答
0

“可穿戴设备”和“电话”提供的信息很少,您实际上在谈论什么。
您可能必须在 WearOS 上添加对 HR 传感器的支持,如Support Additional Sensors中所述...其中传感器甚至是您无法读取的传感器:

<service android:name="com.example.MySensorService"
         android:process=":sensor">
  <intent-filter>
    <action android:name="com.google.android.gms.fitness.service.FitnessSensorService" />
    <!-- include at least one mimeType filter for the supported data types -->
    <data android:mimeType="vnd.google.fitness.data_type/com.google.heart_rate.bpm" />
  </intent-filter>
</service>

显然,您还需要实现自己的特定于传感器的FitnessSensorService.

于 2021-01-13T02:29:09.797 回答