适用于Android的Google Fit API

克里斯蒂安·托雷斯(Cristian Torres)

Google Fit和Flutter

我正在遵循Google的以下文档:Google Fit

我不懂第5步。我不是Android开发人员,也不知道在哪里可以找到代码。第5步

例如,它说:

在您可以从Google Fit API调用方法之前,您必须连接到以下一个或多个以下API客户端,这些客户端是Google Play服务的一部分:

  • 传感器客户端
  • 录音客户
  • 历史客户
  • 会话客户端
  • 目标客户
  • BLE客户端
  • 配置客户端

现在,我尝试连接第一个SensorsClient

但是我不知道代码在哪里,哪个文件?我是一名开发人员,在步骤5中需要​​帮助。

格兰德

dependencies {
    implementation 'com.google.android.gms:play-services-fitness:18.0.0'
    implementation 'com.google.android.gms:play-services-auth:17.0.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
约翰

在Flutter中使用Google Fit Rest Api

Google通过数据源管理数据。要查看所有数据源:

https://www.googleapis.com/fitness/v1/users/me/dataSources

要获取步骤数:https : //www.googleapis.com/fitness/v1/users/me/dataset : aggregate请求正文:

{    
    "aggregateBy" : [{    
        "dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps"    
    }],    
    "bucketByTime": { "durationMillis": 86400000 }, // This is 24 hours    
    "startTimeMillis": 1546210381932,   // Start time    
    "endTimeMillis": 1547210381932  // End Time    
} 

您可以使用fitKit(这是Flutter插件)来读取健康和健身数据。包装iOS上的HealthKit和Android上的GoogleFit。

    import 'package:fit_kit/fit_kit.dart';

void read() async {
  final results = await FitKit.read(
    DataType.HEART_RATE,
    dateFrom: DateTime.now().subtract(Duration(days: 5)),
    dateTo: DateTime.now(),
  );
}

void readLast() async {
  final result = await FitKit.readLast(DataType.HEIGHT);
}

void readAll() async {
  if (await FitKit.requestPermissions(DataType.values)) {
    for (DataType type in DataType.values) {
      final results = await FitKit.read(
        type,
        dateFrom: DateTime.now().subtract(Duration(days: 5)),
        dateTo: DateTime.now(),
      );
    }
  }
}

如果您正在编写定制的平台特定代码

必须先连接到以下一个或多个以下API客户端(属于Google Play服务),然后才能从Google Fit API调用方法:

  1. 传感器客户端:客户端可在本地和连接的设备中公开健身数据的不同来源,并将实时事件传递给侦听器。
  2. 记录客户端:可以将低功耗,始终在线的传感器数据后台收集到Google Fit商店中的客户端。
  3. 历史记录客户端:用于在Google Fit中插入,删除和读取数据的客户端。
  4. 会话客户端:用于在Google Fit中创建和管理用户活动会话的客户端。
  5. 目标客户:用于读取用户在Google Fit中创建的健身目标的客户。BLE客户端
  6. Config Client:用于访问Google Fit中的自定义数据类型和设置的客户端。

您必须连接上述之一。

    DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .bucketByTime(1, TimeUnit.DAYS)
                .enableServerQueries()
                .build();
// History Client 
        Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .readData(readRequest)
                .addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
                    @Override
                    public void onSuccess(DataReadResponse dataReadResponse) {
                        Log.d(TAG, "onSuccess()");
                    }
                })
                .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()");
                    }
                });

从历史记录客户端获取心率的示例:

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.fitness.Fitness;
import com.google.android.gms.fitness.FitnessOptions;
import com.google.android.gms.fitness.data.Bucket;
import com.google.android.gms.fitness.data.DataPoint;
import com.google.android.gms.fitness.data.DataSet;
import com.google.android.gms.fitness.data.DataType;
import com.google.android.gms.fitness.data.Field;
import com.google.android.gms.fitness.request.DataReadRequest;
import com.google.android.gms.fitness.result.DataReadResponse;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;


import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class googleFitData extends AppCompatActivity {

    private static final String TAG = "googleFitData";
    private static final int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = 2;
    private static final int PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION = 3;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_smart_wacth);


        String[] PERMISSIONS = {
                Manifest.permission.ACTIVITY_RECOGNITION
        };


        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION)
                    != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(this,
                        PERMISSIONS,
                        PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);
            }
        } else {
            googleSignin();

        }


    }

    public void googleSignin() {
        FitnessOptions fitnessOptions = FitnessOptions.builder()
                .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ)
                .build();
        if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(this), fitnessOptions)) {
            GoogleSignIn.requestPermissions(
                    this, // your activity
                    GOOGLE_FIT_PERMISSIONS_REQUEST_CODE,
                    GoogleSignIn.getLastSignedInAccount(this),
                    fitnessOptions);
        } else {
            accessGoogleFit();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (GOOGLE_FIT_PERMISSIONS_REQUEST_CODE == requestCode) {

                accessGoogleFit();
            }
            if (PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION == requestCode) {

                accessGoogleFit();
            }
        } else {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

        }

    }

    private void accessGoogleFit() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        long endTime = cal.getTimeInMillis();
        cal.add(Calendar.YEAR, -1);
        long startTime = cal.getTimeInMillis();


        DataReadRequest 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) {
                                showDataSet(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 showDataSet(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)));
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());


                for (Field field : dp.getDataType().getFields()) {

                    Log.e("History", "\tField: " + field.getName() +
                            " Value: " + dp.getValue(field));

                }




        }
    }


}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用适用于Android的Google Fit API查找步骤?

来自分类Dev

适用于Android 5.0的Google API

来自分类Dev

适用于Android 5.0的Google API

来自分类Dev

适用于其他API的Google API密钥(Android)

来自分类Dev

适用于Android和iOS的Google频道API

来自分类Dev

适用于Android应用的Google Places API密钥

来自分类Dev

适用于Google+照片的Android API

来自分类Dev

适用于 android 的 Google 地方 api 未启用

来自分类Dev

计步器Google FIT API

来自分类Dev

Google Fit API:获取与Google Fit的距离

来自分类Dev

Google Fit凭据:适用于生产环境,不适用于开发环境

来自分类Dev

适用于印度的Google Map API

来自分类Dev

适用于onhub的Google API

来自分类Dev

适用于任务的Google日历API

来自分类Dev

适用于Android的语音命令API

来自分类Dev

适用于Android的googleMaps API

来自分类Dev

适用于Android的全球新闻API

来自分类Dev

适用于Android的IntelXDK API通知

来自分类Dev

适用于Android的语音命令API

来自分类Dev

Google Fit API的DataSet对象

来自分类Dev

需要Google Fit API登录

来自分类Dev

适用于企业的Google Maps Mobile SDK与Google Maps Android API

来自分类Dev

Google Maps API v3导航(例如适用于Android的Google Maps)

来自分类Dev

适用于企业的Google Maps Mobile SDK与Google Maps Android API

来自分类Dev

Android:代码适用于 api 19 但不适用于 api 24

来自分类Dev

适用于Android的Google Maps API 2“很遗憾,应用程序已停止。”

来自分类Dev

适用于Android的Google Analytics API v4无法发送屏幕视图

来自分类Dev

Google Play服务不适用于Android模拟器API级别11

来自分类Dev

适用于Xamrin.Android的Google Drive ApI V3迁移

Related 相关文章

热门标签

归档