在应用程序中,我们将用户活动数据上传到 Google Fit,如下所示:
Fitness.getSessionsClient(context, GoogleSignIn.getLastSignedInAccount(context))
.insertSession(((SessionInsertRequest) object))
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// At this point, the session has been inserted and can be read.
if (BuildConfig.DEBUG) {
Log.i(TAG, "Session insert was successful!");
}
//more success handling
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if (BuildConfig.DEBUG) {
Log.w(TAG, "There was a problem inserting the session: " + e.toString()+ "\n"+ e.getLocalizedMessage());
}
//more error handling
}
}
});
直到 2019 年 9 月 4 日左右,此功能都运行良好。
然后 Google 似乎更改了某些内容,导致在创建 SessionInsertRequest 时出现以下警告
应用程序 com.foo.bar 无权访问请求中的数据类型
在 onFailureListener(...) 中,我们收到以下消息:
插入会话时出现问题:com.google.android.gms.common.api.ApiException:5002:数据类型的名称与包名称不匹配。
数据类型未更改。当用户被要求授予上传权限时会请求它们:
private FitnessOptions getFitnessSignInOptions(OAuthType type) {
switch (type) {
case Activity:
return FitnessOptions.builder()
.addDataType(DataType.TYPE_LOCATION_SAMPLE, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.TYPE_CALORIES_EXPENDED, FitnessOptions.ACCESS_WRITE)
.build();
}
}
并在数据源中创建,例如:
DataSource locationDataSource = new DataSource.Builder()
.setAppPackageName(packageName)
.setDataType(DataType.TYPE_LOCATION_SAMPLE)
.setName(uniqueIdentifier + "-locations")
.setType(DataSource.TYPE_RAW)
.build();
类似于谷歌样本 https://github.com/googlesamples/android-fit/blob/master/BasicHistorySessions/app/src/main/java/com/google/android/gms/fit/samples/basichistorysessions/MainActivity.java#L271 shows.
如果我们省略设置数据源的名称或使用 setName(packageName) 并不重要。同样使用 setStreamName(packageName) 也不能解决问题。
还有其他人遇到这个或类似的问题吗?
谢谢
Robert