2015-04-02 8 views
11

Ho sviluppato un'applicazione che deve visualizzare il conteggio dei passi giornalieri. Per fare ciò, ho utilizzato l'API disponibile in Google Fit SDK.Il conteggio dei passaggi recuperato tramite Google Fit Api non corrisponde al conteggio dei passaggi visualizzato nell'app ufficiale di Google Fit

Tutto sembra funzionare correttamente, ma il numero di passaggi che ottengo non corrisponde a quello visualizzato nell'applicazione ufficiale di Google Fit.

Ad esempio, ottengo 2308 passaggi quando l'app Google Fit visualizza 2367 passaggi.

C'è una ragione per questo? Qualcuno ha lo stesso problema? Qualcuno ha un indizio?

+0

È possibile inserire un codice? Hai usato la classe AsyncTask per eseguire i passaggi in background? Ho fatto questa domanda qualche giorno fa, ma nessuno mi ha risposto.http: //stackoverflow.com/questions/30129784/getting-step-count-from-google-fit. – Theo

+0

Puoi pubblicare il tuo codice? –

+0

Questo potrebbe aiutare http://www.gadgetsaint.com/android/google-fit-steps-calories-android/#.WESRX6J97BJ – ASP

risposta

24

Ho trovato la soluzione.

L'app Fit esegue un'ulteriore elaborazione in cima ai passaggi. Valuta i passaggi in base all'attività quando nessuno è registrato.

Se può aiutare qualcuno: È necessario utilizzare un DataSource personalizzato del pacchetto com.google.android.gms

DataSource ESTIMATED_STEP_DELTAS = new DataSource.Builder() 
      .setDataType(DataType.TYPE_STEP_COUNT_DELTA) 
      .setType(DataSource.TYPE_DERIVED) 
      .setStreamName("estimated_steps") 
      .setAppPackageName("com.google.android.gms") 
      .build(); 

E utilizzare questo nel metodo di aggregazione come questo:

DataReadRequest readRequest = new DataReadRequest.Builder() 
      .aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_STEP_COUNT_DELTA) 
      .bucketByTime(1, TimeUnit.DAYS) 
      .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) 
      .build(); 
+0

Questo mi ha aiutato, bel lavoro. Come hai ottenuto questa soluzione? Qualche fonte di queste informazioni, o solo il tuo duro lavoro? – cyborg86pl

+0

@ Thomas Tommaso questo è geniale, puoi aiutarmi con una cosa? DataSource è sempre nullo, come posso scoprire il conteggio dei passaggi da running, walking etc? – ShahrozKhan91

+1

Ancora non ottengo gli stessi valori con questo, la maggior parte dei giorni ha restituito più di quello che Google Fit sta segnalando! In realtà è più impreciso rispetto al modo mostrato nel campione. –

0

Google Fit sdk fa parte dei servizi Google Play. L'app Google Fit ufficiale raccoglie anche gli stessi dati dal sdk dei servizi di Google Play ma Google probabilmente ha aggiunto un altro codice nell'app Google Fit per rendere i dati più accurato. Potrebbe anche essere un bug nell'app Google Fit.

4

Google Play Services 7.3 (pubblicato il 28/4/2015) ha aggiunto un nuovo metodo allo HistoryApi.readDailyTotal, che corrisponde al conteggio dei passi sull'app ufficiale di Google Fit ed è più facile da utilizzare.

PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(fitnessApiClient, DataType.AGGREGATE_STEP_COUNT_DELTA); 
    DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS); 
    if (totalResult.getStatus().isSuccess()) { 
     DataSet totalSet = totalResult.getTotal(); 
     steps = totalSet.isEmpty() ? -1 : totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt(); 
    } 
+0

Come potrei fare questo senza un servizio? Usando await, dà un errore nel codice di attività principale e cambiare l'attesa a 0 secondi non ottiene i dati. – sirvar

+1

Non puoi farlo senza i servizi Google Play. È necessario utilizzare Attendi nel thread in background. Se vuoi usarlo nella discussione principale, chiama result.setResultCallback (...); – Trung

+0

Come ottengo la distanza usando Fitness.HistoryApi.readDailyTotal – Query

1

Come Sameer Z. richiesto Sto postando il codice completo per ottenere valori.

DataSource estimatedSteps = new DataSource.Builder() 
    .setDataType(DataType.TYPE_STEP_COUNT_DELTA) 
    .setType(DataSource.TYPE_DERIVED) 
    .setStreamName("estimated_steps") 
    .setAppPackageName("com.google.android.gms") 
    .build(); 

DataReadRequest readRequest = new DataReadRequest.Builder() 
     .aggregate(estimatedSteps, DataType.AGGREGATE_STEP_COUNT_DELTA) 
     .setTimeRange(startTimeSeconds, endTimeSeconds, TimeUnit.SECONDS) 
     .bucketByTime(1, TimeUnit.DAYS) 
     .enableServerQueries() 
     .build(); 

PendingResult<DataReadResult> pendingResult = Fitness.HistoryApi.readData(client, readRequest); 
pendingResult.setResultCallback(new ResultCallback<DataReadResult>() { 
    @Override 
    public void onResult(@NonNull DataReadResult dataReadResult) { 
     List<Bucket> allBuckets = dataReadResult.getBuckets(); 

     for (Bucket bucket : allBuckets) { 
      long startAtSeconds = bucket.getStartTime(TimeUnit.SECONDS); 

      Value stepsValue = getValue(bucket, DataType.TYPE_STEP_COUNT_DELTA, Field.FIELD_STEPS); 
      int steps = stepsValue != null ? stepsValue.asInt() : 0; 

      Log.d(TAG, String.format("startAtSeconds %s, steps %s", startAtSeconds, steps)); 
     } 
    } 
}); 
Problemi correlati