android - 适用于 Android 的 Google Fit API

标签 android flutter google-fit

Google Fit 和 flutter
我正在关注 Google 的这份文档:
Google Fit
我不明白第 5 步。我不是 Android 开发人员,也不知道在哪里可以找到代码。 Step 5
例如,它说:在您可以从 Google Fit API 调用方法之前,您必须连接到以下一个或多个 API 客户端,它们是 Google Play 服务的一部分:

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

  • 现在,我尝试连接第一个 SensorsClient
    但是我不知道在哪里找到代码,哪个文件?我是一名 Flutter 开发人员,在第 5 步中需要帮助。
    build.grandle
    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'
    }
    

    最佳答案

    使用谷歌健身 Rest Api在 flutter 。

    谷歌通过数据源管理数据。查看所有数据源:

    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(),
          );
        }
      }
    }
    

    如果您正在编写自定义平台特定代码

    在您可以从 Google Fit API 调用方法之前,您必须连接到以下一个或多个 API 客户端,它们是 Google Play 服务的一部分:
  • 传感器客户端:客户端在本地和连接的设备中公开不同来源的健身数据,并将实时事件传递给
    听众。
  • 录音客户端:客户端,可将传感器数据以低功耗、始终在线的方式在后台收集到 Google Fit 商店。
  • 历史客户:用于在 Google Fit 中插入、删除和读取数据的客户端。
  • session 客户:用于在 Google Fit 中创建和管理用户 Activity session 的客户端。
  • 目标客户:用于读取用户在 Google Fit 中创建的健身目标的客户端。 BLE客户端
  • 配置客户端:用于访问 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));
    
                    }
    
    
    
    
            }
        }
    
    
    }
    

    关于android - 适用于 Android 的 Google Fit API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579285/

    相关文章:

    android - Android Studio 2.0 Gradle Project使用gradle:2.0.0无法成功构建

    android - 通过 Google Fit Api 检索的步数与 Google Fit 官方应用程序中显示的步数不匹配

    android - 如何通过在 AnimatedBuilder 中点击来关闭带有可关闭小部件的项目?

    android - Dart flutter ,否则, body 特性

    flutter - 使用 Flutter 图表添加自定义 primaryMeasureAxis

    android - Android 中的计步器 : always on?

    android - 如何重新连接到 google fit in android

    java - ConstraintLayout 以编程方式设置constrainHeight_default

    android - react native 中每一行的 renderRow 索引

    android - 辅助 .realm 文件 getInstance 花费的时间太长