这是我参与新手入门的第2篇文章。 由于公司项目需求,需要集成GoogleFit,上传APP端收集的用户体重、心率、步数等健康数据。特此梳理记录一下相关流程。
一、Google Cloud开发者后台创建应用
- 输入如下网址console.cloud.google.com/ 进入Google Cloud Platform开发者平台
- 登录开发者平台,然后点击“新建项目”
- 输入项目名称,点击创建
4.将页面向下滑,找到“使用入门”,点击“探索并启动API”
5.在信息中心中找到“+启用API和服务”,或者点击侧边栏“库”
6.进入API库页面,在API搜索栏,输入“Fitness API”进行搜索,然后启用“Fitness API”
7.然后点击“创建凭据”,选择“Fitness API”、“用户数据”,点击下一步
8.紧接着需要配置OAuth同意屏幕,输入你的应用相关信息,保存并继续
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的开发就完成了。