Thursday 7 January 2021

No Datasources for `DataType.TYPE_HEART_RATE_BPM` even when watch connected

I have a wearable device where Google Fit is connected with the same account as of my phone. The wearOS device is also connected to my phone.

However the following code returns no data sources corresponding to the DataType.TYPE_HEIGHT, DataType.TYPE_HEART_RATE_BPM, DataType.TYPE_HEART_POINTS, DataType.TYPE_STEP_COUNT_DELTA data points.



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

I do get data source for DataType.TYPE_LOCATION_SAMPLE which is my phone.

My wearOS device is Fossil Gen 5 Carlyle

What am I doing wrong here?



from No Datasources for `DataType.TYPE_HEART_RATE_BPM` even when watch connected

No comments:

Post a Comment