Distance in Fit Api

I am having trouble getting the distance traveled using the Google Fit Api. I used a similar approach for a pedometer and it worked. It just says that the listener is registered.

Most of the code is taken from the Github example.

What could be wrong?

public class MainActivity extends Activity {

public static final String TAG = "BasicSensorsApi";
private static final int REQUEST_OAUTH = 1;
private OnDataPointListener mListener;
private static final String AUTH_PENDING = "auth_state_pending";
private boolean authInProgress = false;

TextView dispSteps;
long numSteps;

private GoogleApiClient mClient = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    if (savedInstanceState != null) {
        authInProgress = savedInstanceState.getBoolean(AUTH_PENDING);
    }

    dispSteps=(TextView)findViewById(R.id.dispStepsTV);
    numSteps=0;

    buildFitnessClient();

}

private void updateDispSteps(final int update) {

    numSteps+=update;

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            dispSteps.setText( String.valueOf(numSteps));
        }
    });
}

private void buildFitnessClient() {
    // Create the Google API Client
    mClient = new GoogleApiClient.Builder(this)
            .addApi(Fitness.API)
            .addScope(new Scope(Scopes.FITNESS_LOCATION_READ_WRITE))
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
            .addConnectionCallbacks(
                    new GoogleApiClient.ConnectionCallbacks() {

                        @Override
                        public void onConnected(Bundle bundle) {
                            Log.i(TAG, "Connected!!!");

                            Fitness.RecordingApi.subscribe(mClient, DataType.TYPE_DISTANCE_DELTA)
                                    .setResultCallback(new ResultCallback<Status>() {
                                        @Override
                                        public void onResult(Status status) {
                                            if (status.isSuccess()) {
                                                if (status.getStatusCode()
                                                        == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) {
                                                    Log.i(TAG, "Existing subscription for activity detected.");

                                                } else {
                                                    Log.i(TAG, "Successfully subscribed!");
                                                }
                                            } else {
                                                Log.i(TAG, "There was a problem subscribing.");

                                            }
                                        }
                                    });

                            mListener = new OnDataPointListener() {
                                @Override
                                public void onDataPoint(DataPoint dataPoint) {
                                    for (Field field : dataPoint.getDataType().getFields()) {
                                        Value value = dataPoint.getValue(field);
                                        updateDispSteps(value.asInt());
                                        Log.i("BIG BLUE TEXT", value.toString());
                                    }
                                }
                            };

                            SensorRequest req = new SensorRequest.Builder()
                                    .setDataType(DataType.TYPE_DISTANCE_DELTA)
                                    .setSamplingRate(10, TimeUnit.SECONDS)
                                    .build();

                            Fitness.SensorsApi.add(mClient, req, mListener)
                                    .setResultCallback(new ResultCallback<Status>() {
                                        @Override
                                        public void onResult(Status status) {
                                            if (status.isSuccess()) {
                                                Log.i(TAG, "Listener registered!");
                                            } else {
                                                Log.i(TAG, "Listener not registered.");
                                            }
                                        }
                                    });

                        }

                        @Override
                        public void onConnectionSuspended(int i) {
                            if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                                Log.i(TAG, "Connection lost.  Cause: Network Lost.");
                            } else if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                                Log.i(TAG, "Connection lost.  Reason: Service Disconnected");
                            }
                        }
                    }
            )
            .addOnConnectionFailedListener(
                    new GoogleApiClient.OnConnectionFailedListener() {
                        // Called whenever the API client fails to connect.
                        @Override
                        public void onConnectionFailed(ConnectionResult result) {
                            Log.i(TAG, "Connection failed. Cause: " + result.toString());
                            if (!result.hasResolution()) {
                                // Show the localized error dialog
                                GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(),
                                        MainActivity.this, 0).show();
                                return;
                            }
                            if (!authInProgress) {
                                try {
                                    Log.i(TAG, "Attempting to resolve failed connection");
                                    authInProgress = true;
                                    result.startResolutionForResult(MainActivity.this,
                                            REQUEST_OAUTH);
                                } catch (IntentSender.SendIntentException e) {
                                    Log.e(TAG,
                                            "Exception while starting resolution activity", e);
                                }
                            }
                        }
                    }
            )
            .build();
}    

      

PS: This is my first question on stackoverflow: P

+3


source to share


1 answer


I think sensor api is used to calculate distance and other values, recoding is for storing them.I used the sensor api and it works for me.

private void buildFitnessClient() {
   if (mClient == null && checkPermissions()) {
       mClient = new GoogleApiClient.Builder(this)
                  .addApi(Fitness.SENSORS_API)
                  .addScope(new Scope(Scopes.FITNESS_LOCATION_READ))
                  .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))....}}


private void findDistDataSrc() {
 Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
 // At least one datatype must be specified.
 .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE,
  DataType.TYPE_DISTANCE_DELTA)
   // Can specify whether data type is raw or derived.
  .setDataSourceTypes(DataSource.TYPE_RAW, DataSource.TYPE_DERIVED)
                .build())
  .setResultCallback(new ResultCallback<DataSourcesResult>() {
  @Override
  public void onResult(DataSourcesResult dataSourcesResult) {
   //Log.i(TAG, "Result: " + dataSourcesResult.getStatus().toString());
   for (DataSource dataSource : dataSourcesResult.getDataSources()) {
    //Log.i(TAG, "Data source found: " + dataSource.toString());
  //Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());
 final DataType dataType = dataSource.getDataType();
    if ((dataType.equals(DataType.TYPE_STEP_COUNT_CUMULATIVE) || dataType.equals(DataType.TYPE_DISTANCE_DELTA)) && mListener == null) {
     Log.i(TAG, "Data source for " + dataType.toString() + " found!  Registering.");
..........}

      



+1


source







All Articles