Always my history api returns empty Buckets
Opened this issue · 1 comments
codingjeremy commented
Issue by puvi008
Monday Oct 01, 2018 at 11:33 GMT
Originally opened as googlearchive/android-fit#41
public class MainActivity extends AppCompatActivity {
public static final String TAG = "StepCounter";
private static final int REQUEST_OAUTH_REQUEST_CODE = 0x1001;
private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
private GoogleApiClient mClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// This method sets up our custom logger, which will print all log messages to the device
// screen, as well as to adb logcat.
initializeLogging();
if (!checkPermissions()) {
requestPermissions();
} else {
callGoogleClient();
}
}
private void callGoogleClient() {
FitnessOptions fitnessOptions =
FitnessOptions.builder()
.addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_READ)
.addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE)
.build();
if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(this), fitnessOptions)) {
GoogleSignIn.requestPermissions(
this,
REQUEST_OAUTH_REQUEST_CODE,
GoogleSignIn.getLastSignedInAccount(this),
fitnessOptions);
} else {
getFitData();
}
}
private boolean checkPermissions() {
int permissionState = ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
int permissionState1 = ActivityCompat.checkSelfPermission(this,
Manifest.permission.BODY_SENSORS);
return permissionState == PackageManager.PERMISSION_GRANTED && permissionState1 == PackageManager.PERMISSION_GRANTED;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_OAUTH_REQUEST_CODE) {
getFitData();
}
}
}
private void getFitData() {
if (mClient == null && checkPermissions()) {
mClient = new GoogleApiClient.Builder(this)
.addScope(new Scope(Scopes.FITNESS_LOCATION_READ))
.addScope(new Scope(Scopes.FITNESS_BODY_READ))
.addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
.addApi(Fitness.HISTORY_API)
.addConnectionCallbacks(
new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
android.util.Log.i(TAG, "Connected!!!");
subscribeToFetching();
}
@Override
public void onConnectionSuspended(int i) {
if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
} else if (i
== GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
}
}
}
)
.enableAutoManage(this, 4, new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult result) {
android.util.Log.i("onConnectionFailed", result.getErrorMessage());
}
})
.build();
}
}
private void
subscribeToFetching() {
new BackgroundFetching().execute();
}
private void getData() {
try {
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.add(Calendar.HOUR, -cal.getInstance().get(Calendar.HOUR_OF_DAY));
cal.add(Calendar.MINUTE, -cal.getInstance().get(Calendar.MINUTE));
cal.add(Calendar.SECOND, -cal.getInstance().get(Calendar.SECOND));
long startTime = cal.getTimeInMillis();
//long startTime = Long.parseLong("1535602500000");
android.util.Log.i(TAG, "Start Time: " + android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", startTime));
android.util.Log.i(TAG, "End Time: " + android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", endTime));
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.AGGREGATE_STEP_COUNT_DELTA, DataType.TYPE_STEP_COUNT_DELTA)
// .aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
/// .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED)
.enableServerQueries()
.bucketByTime(24, TimeUnit.HOURS)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
PendingResult<DataReadResult> result = Fitness.HistoryApi.readData(mClient, readRequest);
result.setResultCallback(new ResultCallback<DataReadResult>() {
@Override
public void onResult(@NonNull DataReadResult dataReadResult) {
int totalSteps = 0;
if (dataReadResult.getBuckets().size() > 0) {
for (Bucket bucket : dataReadResult.getBuckets()) {
for (DataSet set : bucket.getDataSets()) {
for (DataPoint dp : set.getDataPoints()) {
for (Field field : dp.getDataType().getFields()) {
int steps = dp.getValue(field).asInt();
totalSteps += steps;
Toast.makeText(MainActivity.this, totalSteps, Toast.LENGTH_LONG).show();
}
}
}
}
}
}
});
} catch (Exception e) {
android.util.Log.i(TAG, "Error msg: " + e.getMessage());
}
}
private class BackgroundFetching extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
getData();
return null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the main; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_read_data) {
readData();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Initializes a custom log class that outputs both to in-app targets and logcat.
*/
private void initializeLogging() {
// Wraps Android's native log framework.
LogWrapper logWrapper = new LogWrapper();
// Using Log, front-end to the logging chain, emulates android.util.log method signatures.
Log.setLogNode(logWrapper);
// Filter strips out everything except the message text.
MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter();
logWrapper.setNext(msgFilter);
// On screen logging via a customized TextView.
LogView logView = (LogView) findViewById(R.id.sample_logview);
// Fixing this lint error adds logic without benefit.
// noinspection AndroidLintDeprecation
logView.setTextAppearance(R.style.Log);
logView.setBackgroundColor(Color.WHITE);
msgFilter.setNext(logView);
Log.i(TAG, "Ready");
}
private void requestPermissions() {
boolean shouldProvideRationale =
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION);
if (shouldProvideRationale) {
Snackbar.make(
findViewById(R.id.main_activity_view),
"RequestPremission",
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.intro_text, new View.OnClickListener() {
@Override
public void onClick(View view) {
// Request permission
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.BODY_SENSORS},
REQUEST_PERMISSIONS_REQUEST_CODE);
}
})
.show();
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BODY_SENSORS},
REQUEST_PERMISSIONS_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
android.util.Log.i(TAG, "onRequestPermissionResult");
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
if (grantResults.length <= 0) {
android.util.Log.i(TAG, "User interaction was cancelled.");
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
callGoogleClient();
} else {
Snackbar.make(
findViewById(R.id.main_activity_view),
"Premission not Granted",
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.intro_text, new View.OnClickListener() {
@Override
public void onClick(View view) {
// Build intent that displays the App settings screen.
Intent intent = new Intent();
intent.setAction(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package",
BuildConfig.APPLICATION_ID, null);
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
})
.show();
}
}
}
}
codingjeremy commented
Comment by tarunpatel004
Sunday Oct 28, 2018 at 16:07 GMT
public class MainActivity extends AppCompatActivity {
public static final String TAG = "StepCounter"; private static final int REQUEST_OAUTH_REQUEST_CODE = 0x1001; private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34; private GoogleApiClient mClient = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // This method sets up our custom logger, which will print all log messages to the device // screen, as well as to adb logcat. initializeLogging(); if (!checkPermissions()) { requestPermissions(); } else { callGoogleClient(); } } private void callGoogleClient() { FitnessOptions fitnessOptions = FitnessOptions.builder() .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ) .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_WRITE) .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ) .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_WRITE) .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_READ) .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE) .build(); if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(this), fitnessOptions)) { GoogleSignIn.requestPermissions( this, REQUEST_OAUTH_REQUEST_CODE, GoogleSignIn.getLastSignedInAccount(this), fitnessOptions); } else { getFitData(); } } private boolean checkPermissions() { int permissionState = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); int permissionState1 = ActivityCompat.checkSelfPermission(this, Manifest.permission.BODY_SENSORS); return permissionState == PackageManager.PERMISSION_GRANTED && permissionState1 == PackageManager.PERMISSION_GRANTED; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_OAUTH_REQUEST_CODE) { getFitData(); } } } private void getFitData() { if (mClient == null && checkPermissions()) { mClient = new GoogleApiClient.Builder(this) .addScope(new Scope(Scopes.FITNESS_LOCATION_READ)) .addScope(new Scope(Scopes.FITNESS_BODY_READ)) .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ)) .addApi(Fitness.HISTORY_API) .addConnectionCallbacks( new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { android.util.Log.i(TAG, "Connected!!!"); subscribeToFetching(); } @Override public void onConnectionSuspended(int i) { if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) { } else if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) { } } } ) .enableAutoManage(this, 4, new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult result) { android.util.Log.i("onConnectionFailed", result.getErrorMessage()); } }) .build(); } } private void subscribeToFetching() { new BackgroundFetching().execute(); } private void getData() { try { Calendar cal = Calendar.getInstance(); Date now = new Date(); cal.setTime(now); long endTime = cal.getTimeInMillis(); cal.add(Calendar.HOUR, -cal.getInstance().get(Calendar.HOUR_OF_DAY)); cal.add(Calendar.MINUTE, -cal.getInstance().get(Calendar.MINUTE)); cal.add(Calendar.SECOND, -cal.getInstance().get(Calendar.SECOND)); long startTime = cal.getTimeInMillis(); //long startTime = Long.parseLong("1535602500000"); android.util.Log.i(TAG, "Start Time: " + android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", startTime)); android.util.Log.i(TAG, "End Time: " + android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", endTime)); DataReadRequest readRequest = new DataReadRequest.Builder() .aggregate(DataType.AGGREGATE_STEP_COUNT_DELTA, DataType.TYPE_STEP_COUNT_DELTA) // .aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY) /// .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED) .enableServerQueries() .bucketByTime(24, TimeUnit.HOURS) .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) .build(); PendingResult<DataReadResult> result = Fitness.HistoryApi.readData(mClient, readRequest); result.setResultCallback(new ResultCallback<DataReadResult>() { @Override public void onResult(@NonNull DataReadResult dataReadResult) { int totalSteps = 0; if (dataReadResult.getBuckets().size() > 0) { for (Bucket bucket : dataReadResult.getBuckets()) { for (DataSet set : bucket.getDataSets()) { for (DataPoint dp : set.getDataPoints()) { for (Field field : dp.getDataType().getFields()) { int steps = dp.getValue(field).asInt(); totalSteps += steps; Toast.makeText(MainActivity.this, totalSteps, Toast.LENGTH_LONG).show(); } } } } } } }); } catch (Exception e) { android.util.Log.i(TAG, "Error msg: " + e.getMessage()); } } private class BackgroundFetching extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { getData(); return null; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the main; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_read_data) { readData(); return true; } return super.onOptionsItemSelected(item); } /** * Initializes a custom log class that outputs both to in-app targets and logcat. */ private void initializeLogging() { // Wraps Android's native log framework. LogWrapper logWrapper = new LogWrapper(); // Using Log, front-end to the logging chain, emulates android.util.log method signatures. Log.setLogNode(logWrapper); // Filter strips out everything except the message text. MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter(); logWrapper.setNext(msgFilter); // On screen logging via a customized TextView. LogView logView = (LogView) findViewById(R.id.sample_logview); // Fixing this lint error adds logic without benefit. // noinspection AndroidLintDeprecation logView.setTextAppearance(R.style.Log); logView.setBackgroundColor(Color.WHITE); msgFilter.setNext(logView); Log.i(TAG, "Ready"); } private void requestPermissions() { boolean shouldProvideRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION); if (shouldProvideRationale) { Snackbar.make( findViewById(R.id.main_activity_view), "RequestPremission", Snackbar.LENGTH_INDEFINITE) .setAction(R.string.intro_text, new View.OnClickListener() { @Override public void onClick(View view) { // Request permission ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BODY_SENSORS}, REQUEST_PERMISSIONS_REQUEST_CODE); } }) .show(); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BODY_SENSORS}, REQUEST_PERMISSIONS_REQUEST_CODE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { android.util.Log.i(TAG, "onRequestPermissionResult"); if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) { if (grantResults.length <= 0) { android.util.Log.i(TAG, "User interaction was cancelled."); } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { callGoogleClient(); } else { Snackbar.make( findViewById(R.id.main_activity_view), "Premission not Granted", Snackbar.LENGTH_INDEFINITE) .setAction(R.string.intro_text, new View.OnClickListener() { @Override public void onClick(View view) { // Build intent that displays the App settings screen. Intent intent = new Intent(); intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", BuildConfig.APPLICATION_ID, null); intent.setData(uri); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } }) .show(); } } }
}
Did you resolved your problem ?