5

アプリで歩数を取得するために Google Fit API を使用しようとしています。しかし、場所以外のデータ ソースを取得していません。歩数のデータソースを取得するには? 私はこれで立ち往生している4日以上が経ちました。これで私を助けてください。ありがとう。以下は私が使用しているコードです

public class Home extends BaseActivity {
  private static String TAG = "HOME Activity";
  private static final int REQUEST_OAUTH = 1;

  /**
   * Track whether an authorization activity is stacking over the current activity, i.e. when
   * a known auth error is being resolved, such as showing the account chooser or presenting a
   * consent dialog. This avoids common duplications as might happen on screen rotations, etc.
   */
  private static final String AUTH_PENDING = "auth_state_pending";
  private boolean authInProgress = false;

  private GoogleApiClient mClient = null;
  private OnDataPointListener mListener;

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


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

    buildFitnessClient();


  }

  private void findFitnessDataSources() {
    // [START find_data_sources]
    Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
        // At least one datatype must be specified.
        .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA).setDataTypes(DataType.TYPE_STEP_COUNT_CADENCE).setDataTypes(DataType.TYPE_LOCATION_SAMPLE)
            // Can specify whether data type is raw or derived.
        .setDataSourceTypes(DataSource.TYPE_RAW)
        .build())
        .setResultCallback(new ResultCallback<DataSourcesResult>() {
          @Override
          public void onResult(DataSourcesResult dataSourcesResult) {
            Log.v("Inside", "Callback");
            Log.i(TAG, "Result: " + dataSourcesResult.getStatus().toString());
            Log.v("Len", dataSourcesResult.getDataSources().size() + "");
            for (DataSource dataSource : dataSourcesResult.getDataSources()) {
              Log.i(TAG, "Data source found: " + dataSource.toString());
              Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());

              //Let's register a listener to receive Activity data!
              if (dataSource.getDataType().equals(DataType.TYPE_STEP_COUNT_CADENCE)
                  && mListener == null) {
                Log.i(TAG, "Data source for STEP found!  Registering.");
                registerFitnessDataListener(dataSource,
                    DataType.TYPE_STEP_COUNT_CADENCE);
              }
            }
          }
        });
    // [END find_data_sources]
  }

  private void registerFitnessDataListener(DataSource dataSource, DataType dataType) {
    // [START register_data_listener]
    mListener = new OnDataPointListener() {
      @Override
      public void onDataPoint(DataPoint dataPoint) {
        for (Field field : dataPoint.getDataType().getFields()) {
          Value val = dataPoint.getValue(field);
          Log.i(TAG, "Detected DataPoint field: " + field.getName());
          Log.i(TAG, "Detected DataPoint value: " + val);
        }
      }
    };
    Fitness.SensorsApi.add(
        mClient,
        new SensorRequest.Builder()
            .setDataSource(dataSource) // Optional but recommended for custom data sets.
            .setDataType(dataType) // Can't be omitted.
            .setSamplingRate(1, TimeUnit.SECONDS)
            .build(),
        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.");
            }
          }
        });
    // [END register_data_listener]
  }

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

              @Override
              public void onConnected(Bundle bundle) {
                Log.i(TAG, "Connected!!!");
                // Now you can make calls to the Fitness APIs.
                // Put application specific code here.
                findFitnessDataSources();
//                makeFitnessAPIRequest();
              }


              @Override
              public void onConnectionSuspended(int i) {
                // If your connection to the sensor 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");
                }
              }
            }
        )
        .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(),
                      Home.this, 0).show();
                  return;
                }
                // The failure has a resolution. Resolve it.
                // Called typically when the app is not yet authorized, and an
                // authorization dialog is displayed to the user.
                if (!authInProgress) {
                  try {
                    Log.i(TAG, "Attempting to resolve failed connection");
                    authInProgress = true;
                    result.startResolutionForResult(Home.this,
                        REQUEST_OAUTH);
                  } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG,
                        "Exception while starting resolution activity", e);
                  }
                }
              }
            }
        )
        .build();
  }

  private void makeFitnessAPIRequest() {
    SensorRequest request = new SensorRequest.Builder().setDataType(DataType.TYPE_STEP_COUNT_DELTA)
        .setSamplingRate(1, TimeUnit.SECONDS).build();
    PendingResult<Status> reqResult = Fitness.SensorsApi.add(mClient, request, mListener);
  }

  @Override
  protected void onStart() {
    super.onStart();
    // Connect to the Fitness API
    Log.i(TAG, "Connecting...");
    mClient.connect();
  }

  @Override
  protected void onStop() {
    super.onStop();
    if (mClient.isConnected()) {
      mClient.disconnect();
    }
    Log.v("Inside", "Stop");
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_OAUTH) {
      authInProgress = false;
      if (resultCode == RESULT_OK) {
        // Make sure the app is not already connected or attempting to connect
        if (!mClient.isConnecting() && !mClient.isConnected()) {
          mClient.connect();
          Log.v("Inside", "connect");
        }
      }
    }
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(AUTH_PENDING, authInProgress);
  }

  /**
   * Unregister the listener with the Sensors API.
   */
  private void unregisterFitnessDataListener() {
    if (mListener == null) {
      // This code only activates one listener at a time.  If there's no listener, there's
      // nothing to unregister.
      return;
    }

    // [START unregister_data_listener]
    // Waiting isn't actually necessary as the unregister call will complete regardless,
    // even if called from within onStop, but a callback can still be added in order to
    // inspect the results.
    Fitness.SensorsApi.remove(
        mClient,
        mListener)
        .setResultCallback(new ResultCallback<Status>() {
          @Override
          public void onResult(Status status) {
            if (status.isSuccess()) {
              Log.i(TAG, "Listener was removed!");
            } else {
              Log.i(TAG, "Listener was not removed.");
            }
          }
        });
    // [END unregister_data_listener]
  }

}
4

4 に答える 4

1

onDataPointListener 内のこの行も変更します

 Log.i(TAG, "Detected DataPoint value: " + val);

 Log.i(TAG, "Detected DataPoint value: " + val.asInt());

あなたは歩数を数えますが、それは私にとって面白いことです. たとえば、25歩に達しますが、カウントアップする代わりにカウントダウンします.少なくとも、ステップカウンタービットが何かをしている.

于 2015-05-13T09:32:24.337 に答える