无法收听多种传感器数据类型(步长和距离)

时间:2019-02-04 11:14:04

标签: android google-fit sensors

我想访问适用于Android的Google Fit Sensors API,以实时更新步数和行进距离。但是,我无法同时收听两种数据类型。如果我只听一听,效果很好。

我发现此主题描述了相同的问题:Google Fit: Cannot update both step and distance in real-time。但是,接受的答案无效,它使用旧的GoogleApiClient而不是较新的GoogleApi。我遵循了本教程:Access Raw Sensor Data

这是我的代码:

private void findDataSources() {
    Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
            .findDataSources(
                    new DataSourcesRequest.Builder()
                            .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA, DataType.TYPE_DISTANCE_DELTA)
                            .setDataSourceTypes(DataSource.TYPE_RAW, DataSource.TYPE_DERIVED)
                            .build())
            .addOnSuccessListener(
                    new OnSuccessListener<List<DataSource>>() {
                        @Override
                        public void onSuccess(List<DataSource> dataSources) {
                            for (DataSource dataSource : dataSources) {
                                if (dataSource.getStreamName().equals("live_distance_from_steps") || dataSource.getStreamName().equals("live_step_deltas")) {
                                    registerListener(dataSource);
                                }
                            }
                        }
                    });
}

private void registerListener(DataSource dataSource) {
    if (dataSource.getDataType().equals(DataType.TYPE_STEP_COUNT_DELTA)) {
        myStepCountListener = new OnDataPointListener() {
            @Override
            public void onDataPoint(DataPoint dataPoint) {
                // Do something with the steps
            }
        };

        Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .add(new SensorRequest.Builder()
                                .setDataSource(dataSource)
                                .setSamplingRate(750, TimeUnit.MILLISECONDS)
                                .build(),
                        myStepCountListener)
                .addOnCompleteListener(
                        new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    System.out.println("Listener registered!");
                                }
                            }
                        });
    } else if (dataSource.getDataType().equals(DataType.TYPE_DISTANCE_DELTA)) {
        myDistanceListener = new OnDataPointListener() {
            @Override
            public void onDataPoint(DataPoint dataPoint) {
                // Do something with the distance
            }
        };

        Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .add(new SensorRequest.Builder()
                                .setDataSource(dataSource)
                                .setSamplingRate(900, TimeUnit.MILLISECONDS)
                                .build(),
                        myDistanceListener)
                .addOnCompleteListener(
                        new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    System.out.println("Listener registered!");
                                }
                            }
                        });
    }
}

控制台输出是Listener registered!的两倍。因此它似乎可行,但是只调用了一种onDataPoint方法(一种随机发生)。

如上所述,如果删除dataSource.getStreamName().equals("live_step_deltas")"live_distance_from_steps",一切正常,但我只能得到一种数据类型。

我已经尝试两次注册相同的侦听器,并在该侦听器中实现if-else-clause来决定步长和距离数据点之间的关系。但是,这个侦听器(即使为两种数据类型注册了两次)也仅接收两种数据类型之一的数据点。

0 个答案:

没有答案