【问题标题】:Is Google Fit API only read data at local?Google Fit API 是否仅在本地读取数据?
【发布时间】:2018-03-06 04:43:41
【问题描述】:

我有 2 部手机使用 Gmail: 电话1:安装google fit app并将数据同步到网络[https://fit.google.com][1]

手机 2:未安装 google fit 应用,我使用 Google Fit Api 读取步数数据。 但它不能返回结果。

我的代码:

Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA)
                .addOnSuccessListener { dataSet ->
                    val total = (if (dataSet.isEmpty)
                        0
                    else
                        dataSet.dataPoints[0].getValue(Field.FIELD_STEPS).asInt()).toLong()
                    Log.i(TAG, "Total steps: " + total)
                    txtStep.setText(total.toString())
                }
                .addOnFailureListener(
                        object : OnFailureListener {
                            override fun onFailure(e: Exception) {
                                Log.w(TAG, "There was a problem getting the step count.", e)
                            }
                        })

我必须在手机 2 上安装 google fit 应用吗? Google Fit API 是否只在本地读取数据?

我曾尝试使用 .enableServerQueries() 但它仍然无法返回数据。

val endTime = cal.timeInMillis
        cal.add(Calendar.DAY_OF_YEAR, -1)
        cal.set(Calendar.HOUR_OF_DAY, 23)
        val startTime = cal.timeInMillis
        var readRequest = DataReadRequest.Builder()
                .read(DataType.TYPE_STEP_COUNT_DELTA)
                .enableServerQueries()
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build()
        Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .readData(readRequest)
                .addOnSuccessListener { dataReadResult ->
                    var total =0
                    if (dataReadResult.buckets.size > 0) {
                            for (bucket in dataReadResult.buckets) {
                            val dataSets = bucket.dataSets
                            for (dataSet in dataSets) {
                                for (dp in dataSet.dataPoints) {
                                    for (field in dp.dataType.fields) {
                                        total=total + dp.getValue(field).asInt()
                                    }
                                }
                            }
                        }
                    } else if (dataReadResult.dataSets.size > 0) {

                        for (dataSet in dataReadResult.dataSets) {
                            for (dp in dataSet.dataPoints) {
                                for (field in dp.dataType.fields) {
                                    total=total + dp.getValue(field).asInt()
                                }
                            }
                        }
                    }
                    txtStep.setText(total.toString())
                }
                .addOnFailureListener(
                        object : OnFailureListener {
                            override fun onFailure(e: Exception) {
                                Log.w(TAG, "There was a problem getting the step count.", e)
                            }
                        })

只有当我从Setting点击sync Google Fit Data时才能读取数据

【问题讨论】:

  • 我不熟悉是否需要安装 Google fit 应用才能从其他设备获取数据,但您可以查看有关 Work with the Fitness History 的文档。它表示,“在记录数据之前创建订阅可以使您的应用程序与其他设备的数据同步,并允许在设备上被动记录数据。”同样在查询时,您必须在 DataReadRequest 中添加.enableServerQueries()。希望这会有所帮助。
  • 我在fit.google.com 有记录和数据。我曾尝试使用 enableServerQueries 但它仍然没有返回数据。
  • @DT 有同样的问题。你最终得到了这个工作吗?
  • @ciaranodc:不,我已经通过我们的服务器管理 Googlefit 数据。

标签: android google-fit


【解决方案1】:

如果您不想使用 Google Fit 应用程序,可以使用 getRecordingClient 订阅健身数据。

您可以为应用中的不同数据类型或数据源创建多个订阅。即使您的应用未运行,Google 健身也会存储来自活动订阅的健身数据,并在系统重启时恢复这些订阅。

记录的数据在用户的健身历史中可用。如果您还想在您的应用程序中实时显示数据,则需要将 Sensors API 与 Recording API 一起使用。要使用会话元数据记录健身数据,您可以使用 Sessions API。

订阅健身数据

Fitness.getRecordingClient(this, GoogleSignIn.getLastSignedInAccount(this))
            .subscribe(DataType.TYPE_ACTIVITY_SEGMENT)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.i(TAG, "Successfully subscribed!");
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.i(TAG, "There was a problem subscribing.");
                }
            });

心率数据读取请求

readRequest = new DataReadRequest.Builder()
                .read(DataType.TYPE_HEART_RATE_BPM)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .bucketByTime(365, TimeUnit.DAYS)
                .build();

从历史中检索数据

Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
            .readData(readRequest)
            .addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
                @Override
                public void onSuccess(DataReadResponse dataReadResponse) {
                    Log.d(TAG, "onSuccess()");

                    for (Bucket bucket : dataReadResponse.getBuckets()) {
                        Log.e("History", "Data returned for Data type: " + bucket.getDataSets());

                        List<DataSet> dataSets = bucket.getDataSets();
                        for (DataSet dataSet : dataSets) {
                            displayDataSet(dataSet);
                        }
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.e(TAG, "onFailure()", e);
                }
            })
            .addOnCompleteListener(new OnCompleteListener<DataReadResponse>() {
                @Override
                public void onComplete(@NonNull Task<DataReadResponse> task) {
                    Log.d(TAG, "onComplete()");
                }
            });

显示数据

private void displayDataSet(DataSet dataSet) {
        DateFormat dateFormat = DateFormat.getDateInstance();
        DateFormat timeFormat = DateFormat.getTimeInstance();

        for (DataPoint dp : dataSet.getDataPoints()) {
            Log.e("History", "Data point:");
            Log.e("History", "\tType: " + dp.getDataType().getName());
            Log.e("History", "\tStart: " + dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
            Log.e("History", "\tEnd: " + dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
            for (Field field : dp.getDataType().getFields()) {
                Log.e("History", "\tField: " + field.getName() +
                        " Value: " + dp.getValue(field));
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多