android – Step Counter Google FIT API

我目前正在尝试使用Google Fit API.这是我第一个使用API​​的应用程序,我主要是按照Google的文档.

以下是我有的似乎有问题的代码

我遇到的问题是它似乎没有更新台阶计数器.

public class MainActivity extends Activity
        implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

        private static final String TAG = "FitActivity";
    //[START Auth_Variable_References]
        private static final int REQUEST_OAUTH = 1;
    // [END auth_variable_references]
        private GoogleApiClient mClient = null;

        int mInitialNumberOfSteps = 0;
        private TextView mStepsTextView;
        private boolean mFirstCount = true;

    // Create Builder View
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mStepsTextView = (TextView) findViewById(R.id.textview_number_of_steps);
        }


        private void connectFitness() {
            Log.i(TAG, "Connecting...");

            // Create the Google API Client
            mClient = new GoogleApiClient.Builder(this)
                    // select the Fitness API
                    .addApi(Fitness.API)
                            // specify the scopes of access
                    .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
                     .addScope(new Scope(Scopes.FITNESS_LOCATION_READ))
                    .addScope(new Scope(Scopes.FITNESS_BODY_READ_WRITE))
                                    // provide callbacks
                            .addConnectionCallbacks(this)
                            .addOnConnectionFailedListener(this)
                            .build();

            // Connect the Google API client
            mClient.connect();
        }

        // Manage OAuth authentication
        @Override
        public void onConnectionFailed(ConnectionResult result) {

            // Error while connecting. Try to resolve using the pending intent returned.
            if (result.getErrorCode() == ConnectionResult.SIGN_IN_REQUIRED ||
                    result.getErrorCode() == FitnessStatusCodes.NEEDS_OAUTH_PERMISSIONS) {
                try {
                    // Request authentication
                    result.startResolutionForResult(this, REQUEST_OAUTH);
                } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Exception connecting to the fitness service", e);
                }
            } else {
                Log.e(TAG, "Unknown connection issue. Code = " + result.getErrorCode());
            }
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == REQUEST_OAUTH) {
                if (resultCode == RESULT_OK) {
                    // If the user authenticated, try to connect again
                    mClient.connect();
                }
            }
        }

        @Override
        public void onConnectionSuspended(int i) {
            // If your connection gets lost at some point,
            // you'll be able to determine the reason and react to it here.
            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");
            }
        }

        @Override
        public void onConnected(Bundle bundle) {

            Log.i(TAG, "Connected!");

            // Now you can make calls to the Fitness APIs.
            invokeFitnessAPIs();

        }

        private void invokeFitnessAPIs() {

            // Create a listener object to be called when new data is available
            OnDataPointListener listener = new OnDataPointListener() {
                @Override
                public void onDataPoint(DataPoint dataPoint) {

                    for (Field field : dataPoint.getDataType().getFields()) {
                        Value val = dataPoint.getValue(field);
                        updateTextViewWithStepCounter(val.asInt());
                    }
                }
            };

            //Specify what data sources to return
            DataSourcesRequest req = new DataSourcesRequest.Builder()
                    .setDataSourceTypes(DataSource.TYPE_DERIVED)
                    .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA)
                    .build();

            //  Invoke the Sensors API with:
            // - The Google API client object
            // - The data sources request object
            PendingResult<DataSourcesResult> pendingResult =
                    Fitness.SensorsApi.findDataSources(mClient, req);

            //  Build a sensor registration request object
            SensorRequest sensorRequest = new SensorRequest.Builder()
                    .setDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE)
                    .setSamplingRate(1, TimeUnit.SECONDS)
                    .build();

            //  Invoke the Sensors API with:
            // - The Google API client object
            // - The sensor registration request object
            // - The listener object
            PendingResult<Status> regResult =
              Fitness.SensorsApi.add(mClient,
                      new SensorRequest.Builder()
                      .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
                      .build(),
                      listener);


            // 4. Check the result asynchronously
            regResult.setResultCallback(new ResultCallback<Status>()
            {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        Log.d(TAG, "listener registered");
                        // listener registered
                    } else {
                        Log.d(TAG, "listener not registered");
                        // listener not registered
                    }
                }
            });
        }

        // Update the Text Viewer with Counter of Steps..
        private void updateTextViewWithStepCounter(final int numberOfSteps) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getBaseContext(), "On Datapoint!", Toast.LENGTH_SHORT);

                    if(mFirstCount && (numberOfSteps != 0)) {
                        mInitialNumberOfSteps = numberOfSteps;
                        mFirstCount = false;
                    }
                    if(mStepsTextView != null){
                        mStepsTextView.setText(String.valueOf(numberOfSteps - mInitialNumberOfSteps));
                    }
                }
            });
        }

    //Start
    @Override
    protected void onStart() {
        super.onStart();
        mFirstCount = true;
        mInitialNumberOfSteps = 0;
        if (mClient == null || !mClient.isConnected()) {
            connectFitness();
        }
    }
    //Stop
        @Override
        protected void onStop() {
            super.onStop();
            if(mClient.isConnected() || mClient.isConnecting()) mClient.disconnect();
            mInitialNumberOfSteps = 0;
            mFirstCount = true;
        }

    }
您可以尝试从OrangeGangster的StepSensor库.

它包含一个自定义服务,允许从Android 4.4引入的Sensor.TYPE_STEP_COUNTER中收集数据(仅适用于支持此硬件功能的设备).

http://stackoverflow.com/questions/28476809/step-counter-google-fit-api

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:android – Step Counter Google FIT API