Android端开发集成GoogleFit

1,562 阅读2分钟

这是我参与新手入门的第2篇文章。 由于公司项目需求,需要集成GoogleFit,上传APP端收集的用户体重、心率、步数等健康数据。特此梳理记录一下相关流程。

一、Google Cloud开发者后台创建应用
  1. 输入如下网址console.cloud.google.com/ 进入Google Cloud Platform开发者平台
  2. 登录开发者平台,然后点击“新建项目”
  3. 输入项目名称,点击创建 image.png

4.将页面向下滑,找到“使用入门”,点击“探索并启动API” image.png

5.在信息中心中找到“+启用API和服务”,或者点击侧边栏“库”

image.png

6.进入API库页面,在API搜索栏,输入“Fitness API”进行搜索,然后启用“Fitness API”

image.png

7.然后点击“创建凭据”,选择“Fitness API”、“用户数据”,点击下一步

image.png

image.png

8.紧接着需要配置OAuth同意屏幕,输入你的应用相关信息,保存并继续

image.png

9.范围可选择,此处我没有做配置,直接进行下一项,OAuth客户端ID配置,在应用类型处选择Android,然后输入应用名称,软件报名,SHA-1证书指纹,然后点击创建即可完成凭据的创建了
获取证书指纹命令如下:

keytool -keystore path-to-debug-or-production-keystore -list -v
二、在工程中添加相关代码

1.首先要引入GoogleFit的依赖库

apply plugin: 'com.android.application'

...

dependencies {
    implementation 'com.google.android.gms:play-services-fitness:20.0.0'
    implementation 'com.google.android.gms:play-services-auth:19.0.0'
}

2.最好封装一个GoogleFit的工具类,因为要请求权限和上传相关数据,首先是要初始化fitness,需要配置要上传的数据类型,此处我配置了体重、心率、步数、卡路里、距离五个类型,本来公司还需要上传血压、体温等数据,但是GoogleFit目前不开放这类数据的上传权限。

googleFitHistoryApi = new GoogleFitHistoryApi(context);
        fitnessOptions = FitnessOptions.builder()
                .addDataType(DataType.TYPE_WEIGHT, FitnessOptions.ACCESS_WRITE)
                .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_WRITE)
                .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_WRITE)
                .addDataType(DataType.TYPE_CALORIES_EXPENDED, FitnessOptions.ACCESS_WRITE)
                .addDataType(DataType.TYPE_DISTANCE_DELTA, FitnessOptions.ACCESS_WRITE)
                .build();

3.初始化完成了,下面就要检查权限了

private boolean oAuthPermissionsApproved() {
        return GoogleSignIn.hasPermissions(getGoogleAccount(), fitnessOptions);
    }

    private GoogleSignInAccount getGoogleAccount() {
        return GoogleSignIn.getAccountForExtension(mContext, fitnessOptions);
    }

    /**
     * GoogleFit登录与权限检测
     */
    public void fitSignIn(Context context) {
        Logger.t(GoogleFitManager.TAG_GOOGLE_FIT).d("--fitSignIn--");
        initGoogleFit(context);
        if (mContext != null && !oAuthPermissionsApproved()) {
            GoogleSignIn.requestPermissions(
                    (Activity) mContext,
                    ConstantsCommon.GOOGLE_FIT_REQUEST_PERMISSION,
                    getGoogleAccount(), fitnessOptions);
        }else{
            Logger.t(GoogleFitManager.TAG_GOOGLE_FIT).d("--already google Permission--");
        }
    }

4.封装要上传上传数据信息,此处以上传一条体重数据为例

    /**
     * 封装体重请求类型
     *
     * @param weight
     * @return
     */
    public DataUpdateRequest packageHsData(float weight) {
        long timeStamp = hsEntity.getMeasureTime() * 1000;
        DataSource dataSource =
                new DataSource.Builder()
                        .setAppPackageName(mContext)
                        .setDataType(DataType.TYPE_WEIGHT)
                        .setType(DataSource.TYPE_RAW)
                        .setStreamName(GoogleFitManager.TAG_GOOGLE_FIT + " - weight count")
                        .build();

        DataSet.Builder dataSetBuilder = DataSet.builder(dataSource);

        DataPoint bloodPressure =
                DataPoint.builder(dataSource)
                        .setTimestamp(timeStamp, TimeUnit.MILLISECONDS)
                        .setField(Field.FIELD_WEIGHT, weight)
                        .build();
        dataSetBuilder.add(bloodPressure);

        return new DataUpdateRequest.Builder()
                .setDataSet(dataSetBuilder.build())
                .setTimeInterval(timeStamp, timeStamp, TimeUnit.MILLISECONDS)
                .build();
    }

5.最后一步就是上传数据了,将上一步封装好的dataSet填到updateData中

Fitness.getHistoryClient(mContext, Objects.requireNonNull(GoogleSignIn.getLastSignedInAccount(mContext)))
                            .updateData(dataSet)
                            .addOnSuccessListener(aVoid -> {
                                Logger.t(GoogleFitManager.TAG_GOOGLE_FIT).d("uploadHsData insert was successful!");
                            })
                            .addOnFailureListener(e -> {
                                Logger.t(GoogleFitManager.TAG_GOOGLE_FIT).e("There was a problem inserting the dataset. e:" + e.toString());
                                e.printStackTrace();
                            });

至此,GoogleFit的开发就完成了。