0

我可以使用 Sensor API 实时获取步数数据。我也可以实时获取距离数据。但是,我无法将步伐和距离放在一起。

这是我的代码。

private void findFitnessDataSources()
    {
        DataSourcesRequest dataSourcesRequest = new DataSourcesRequest.Builder()
                .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA, DataType.TYPE_DISTANCE_DELTA, DataType.TYPE_MOVE_MINUTES)
                .setDataSourceTypes(DataSource.TYPE_DERIVED)
                .build();

        Fitness.getSensorsClient(appContext, googleSignInAccount)
                .findDataSources(dataSourcesRequest)
                .addOnSuccessListener(
                        new OnSuccessListener<List<DataSource>>()
                        {
                            @Override
                            public void onSuccess(List<DataSource> dataSources)
                            {
                                for (DataSource dataSource : dataSources)
                                {
                                    Log.i(TAG, "Data source found: " + dataSource.toString());
                                    Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());

                                    if (dataSource.getDataType().equals(DataType.TYPE_STEP_COUNT_DELTA) && stepsListener == null)
                                    {
                                        Log.i(TAG, "Data source for TYPE_STEP_COUNT_DELTA found!  Registering.");

                                        stepsDataSource = dataSource;
                                        stepsListener = new OnDataPointListener()
                                        {
                                            @Override
                                            public void onDataPoint(DataPoint dataPoint)
                                            {
                                                for (Field field : dataPoint.getDataType().getFields())
                                                {
                                                    Value val = dataPoint.getValue(field);

                                                    Log.i(TAG, "Detected DataPoint field: " + field.getName());
                                                    Log.i(TAG, "Detected DataPoint value: " + val);
                                                }
                                            }
                                        };

                                        registerFitnessDataListener(stepsDataSource, stepsListener, DataType.TYPE_STEP_COUNT_DELTA, 3, TimeUnit.SECONDS);
                                    }
                                    else if (dataSource.getDataType().equals(DataType.TYPE_DISTANCE_DELTA) && distanceListener == null)
                                    {
                                        Log.i(TAG, "Data source for TYPE_DISTANCE_DELTA found!  Registering.");

                                        distanceDataSource = dataSource;
                                        distanceListener = new OnDataPointListener()
                                        {
                                            @Override
                                            public void onDataPoint(DataPoint dataPoint)
                                            {
                                                for (Field field : dataPoint.getDataType().getFields())
                                                {
                                                    Value val = dataPoint.getValue(field);

                                                    Log.i(TAG, "Detected DataPoint field: " + field.getName());
                                                    Log.i(TAG, "Detected DataPoint value: " + val);
                                                }
                                            }
                                        };

                                        registerFitnessDataListener(distanceDataSource, distanceListener, DataType.TYPE_DISTANCE_DELTA, 3, TimeUnit.SECONDS);
                                    }
                                    else if (dataSource.getDataType().equals(DataType.TYPE_MOVE_MINUTES) && moveMinutesListener == null)
                                    {
                                        Log.i(TAG, "Data source for TYPE_MOVE_MINUTES found!  Registering.");

                                        moveMinutesDataSource = dataSource;
                                        moveMinutesListener = new OnDataPointListener()
                                        {
                                            @Override
                                            public void onDataPoint(DataPoint dataPoint)
                                            {
                                                for (Field field : dataPoint.getDataType().getFields())
                                                {
                                                    Value val = dataPoint.getValue(field);

                                                    Log.i(TAG, "Detected DataPoint field: " + field.getName());
                                                    Log.i(TAG, "Detected DataPoint value: " + val);
                                                }
                                            }
                                        };

                                        registerFitnessDataListener(moveMinutesDataSource, moveMinutesListener, DataType.TYPE_MOVE_MINUTES, 3, TimeUnit.SECONDS);
                                    }
                                }
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener()
                        {
                            @Override
                            public void onFailure(@NonNull Exception e)
                            {
                                Log.e(TAG, "failed", e);
                            }
                        });
    }

    private void registerFitnessDataListener(DataSource dataSource, OnDataPointListener listener, DataType dataType, long samplingRate, TimeUnit timeUnit)
    {
        SensorRequest sensorRequest = new SensorRequest.Builder()
                .setDataSource(dataSource)
                .setDataType(dataType)
                .setSamplingRate(samplingRate, timeUnit)
                .build();

        Fitness.getSensorsClient(appContext, googleSignInAccount)
                .add(sensorRequest, listener)
                .addOnCompleteListener(
                        new OnCompleteListener<Void>()
                        {
                            @Override
                            public void onComplete(@NonNull Task<Void> task)
                            {
                                if (task.isSuccessful())
                                {
                                    Log.i(TAG, "Listener registered!");
                                }
                                else
                                {
                                    Log.e(TAG, "Listener not registered.", task.getException());
                                }
                            }
                        });
    }

更改不同数据类型的采样率并没有帮助。

我用谷歌搜索了一下,也许这是由于需要添加线程,结果,只有一个侦听器只在一个现有的主线程中工作。但我不是专业的 Android 开发人员,所以我不太了解它。

谷歌也只给出了文档中最简单的一个数据类型的例子,真可惜。

如果有人知道是否可以同时实时接收多种数据类型的数据,请告诉我!

PS 顺便说一句,似乎无法从传感器 API 接收有关 MOVE_MINUTES 的数据,是真的吗?

4

0 回答 0