I am creating an exercise app that records pushups. My goal is to have the data integrated with Google Fit so that it will sync between devices or in the case where the user gets a new device.
I have successfully been able to insert data into Google Fit and can then query it. It also shows up on the Google Fit web app.
My problem is that when I'm on my Nexus 7 and I try to query all data it only returns data for my Nexus 7 and NOT both my ZTE Maven and my Nexus 7. And when I'm on my ZTE Maven and I try to query all data it only returns data for my ZTE Maven and NOT both my Nexus 7 and my ZTE Maven. And I want it to be able to show ALL data from ALL devices. Any help would be appreciated!
I looked at this question, but I've already implemented what they suggested...
See my code below...
Thanks, Joshua
My Google Api Client is built like this
new GoogleApiClient.Builder(activity)
.addApi(Fitness.HISTORY_API)
.addApi(Fitness.SESSIONS_API)
.addScope(Fitness.SCOPE_ACTIVITY_READ_WRITE)
.useDefaultAccount()
.addConnectionCallbacks(...)
.addOnConnectionFailedListener(...)
.build();
Insert pushups code:
private class InsertGoogleFitDataTask extends AsyncTask<WorkoutSet, Void, Boolean> {
protected Boolean doInBackground (WorkoutSet... workoutSets) {
DataSource dataSource = new DataSource.Builder().setAppPackageName(RootLogActivity.this)
.setDataType(DataType.TYPE_WORKOUT_EXERCISE)
.setName("Push Ups")
.setType(DataSource.TYPE_RAW)
.build();
DataSet dataSet = DataSet.create(dataSource);
for (WorkoutSet workoutSet : workoutSets) {
long startTime = workoutSet.getTimeInterval().getStartMillis();
long endTime = workoutSet.getTimeInterval().getEndMillis();
DataPoint dataPoint = DataPoint.create(dataSource);
int duration = (int) (endTime - startTime);
dataPoint.setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS);
dataPoint.setTimestamp(startTime + (endTime - startTime) / 2, TimeUnit.MILLISECONDS);
dataPoint.getValue(Field.FIELD_EXERCISE).setString(WorkoutExercises.PUSHUP);
dataPoint.getValue(Field.FIELD_REPETITIONS).setInt(workoutSet.getTotalCount());
dataPoint.getValue(Field.FIELD_DURATION).setInt(duration);
dataPoint.getValue(Field.FIELD_RESISTANCE_TYPE).setInt(Field.RESISTANCE_TYPE_BODY);
dataPoint.getValue(Field.FIELD_RESISTANCE).setFloat(0);
dataSet.add(dataPoint);
}
Session session = new Session.Builder().setStartTime(workoutSets[0].getTimeInterval().getStartMillis(), TimeUnit.MILLISECONDS)
.setEndTime(workoutSets[0].getTimeInterval().getEndMillis(), TimeUnit.MILLISECONDS)
.setActivity(FitnessActivities.OTHER)
.build();
SessionInsertRequest sessionInsertRequest = new SessionInsertRequest.Builder().addDataSet(dataSet).setSession(session).build();
com.google.android.gms.common.api.Status insertStatus = Fitness.SessionsApi.insertSession(GoogleUtils.getFitClient(), sessionInsertRequest)
.await(30, TimeUnit.SECONDS);
return insertStatus.isSuccess();
}
@Override
protected void onPostExecute (Boolean success) {
Snackbar.make(tabLayout, String.format("Insert %ssuccessful", success ? "" : "un"), Snackbar.LENGTH_SHORT).show();
new UpdateGoogleFitDataTask().execute();
}
}
Update pushups log code:
private class UpdateGoogleFitDataTask extends AsyncTask<Void, Void, ArrayList<WorkoutMonth>> {
protected ArrayList<WorkoutMonth> doInBackground (Void... ignored) {
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.clear();
cal.set(2013, Calendar.DECEMBER, 6); // This is the day before the first release version. There should be no data before.
long startTime = cal.getTimeInMillis();
DataSource dataSource = new DataSource.Builder().setAppPackageName(RootLogActivity.this)
.setDataType(DataType.TYPE_WORKOUT_EXERCISE)
.setName("Push Ups")
.setType(DataSource.TYPE_RAW)
.build();
final DataReadRequest dataReadRequest = new DataReadRequest.Builder().read(dataSource)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.enableServerQueries()
.build();
SessionReadRequest sessionReadRequest = new SessionReadRequest.Builder().readSessionsFromAllApps()
.enableServerQueries()
.read(dataSource)
.setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
SessionReadResult dataReadResult = Fitness.SessionsApi.readSession(GoogleUtils.getFitClient(), sessionReadRequest)
.await(1, TimeUnit.MINUTES);
ArrayList<DataSet> filteredDataSets = new ArrayList<>();
for (Session session : dataReadResult.getSessions()) {
for (DataSet dataSet : dataReadResult.getDataSet(session)) {
dumpDataSet(dataSet);
if (!dataSet.getDataType().equals(DataType.TYPE_WORKOUT_EXERCISE)) { continue; }
filteredDataSets.add(dataSet);
}
}
return WorkoutMonth.createMonthsFromDataSets(filteredDataSets);
}
...
}