2015-09-03 14 views
13

Sto lavorando all'applicazione demo per ottenere l'esempio dell'attività corrente utilizzando Google Fit. Posso ottenere velocità e distanza correttamente. Ma non sta restituendo lo stato "in_vehicle" o "biking" molto frequentemente sebbene mi trovassi nello stesso stato. Trova lo screenshot allegato per lo stesso. Ho ottenuto una velocità di 59.40KM/H (36.91 M/h) e in quel momento non ha restituito lo stato di attività "in_vehicle".Ottieni attività corrente dall'API di Google Fit Android

Si prega di fornire soluzione/feedback per lo stesso.

Codice:

@Override 
public void onDataPoint(DataPoint dataPoint) { 
    for (Field field : dataPoint.getDataType().getFields()) { 
     Value val = dataPoint.getValue(field); 
      if(field.getName().trim().toLowerCase().equals("activity")) 
        { 
         if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("biking")) 
         { 
          strState = "Cycling"; 
         } 
         else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("in_vehicle")) 
         { 
          strState = "Automotive"; 
         } 
         else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("walking")) 
         { 
          strState = "Walking"; 
         } 
         else 
         { 
          strState = "Not Moving"; 
         } 
        } 
      } 
} 

Grazie.

IMAGE

+0

pezzo di codice faremmo meglio a capire. – dhams

+0

pubblicato/modificato .. – steve

+0

È necessario modificare il titolo e il corpo della domanda per indicare che "attività" non si riferisce a "android.app.Activity", ma piuttosto alla stringa "attività fisica". –

risposta

1

Come hai detto, la velocità è corretta. Puoi inserire il codice personalizzato scritto qui sotto.

if (strState.equals("Automotive") && speed == 0.00) 
{ 
   strState = "Not Moving"; 
} 
else if (strState.equals("Not Moving") && speed > 5) 
{ 
   strState = "Automotive"; 
} 
else 
{ 
   strState = "strState"; 
} 

Questo potrebbe non essere quello corretto, ma ti darà il risultato dello stato nelle vicinanze.

-2

io non sono a conoscenza API di Google in forma, quindi l'unico consiglio che posso darvi è quello di controllare il codice con attenzione. È
Integer.parseInt(val.toString())
restituire il diritto int e può
FitnessActivities.getName()
uguali "bike", "camminare", "in_vehicle", ecc

Come posso vedere da qui: https://developers.google.com/fit/rest/v1/reference/activity-types

Biking, In vehicle e Walking sono 0, 1 e 7. Controlla cosa FitnessActivities.getName (0) sta restituendo per esempio, controlla anche val che restituisce valori diversi o restituisce sempre lo stesso y tempo

Se avete qualche problema con i vostri codici dovreste sapere cosa sta facendo il codice su qualsiasi linea, quali metodi e funzioni stanno tornando ... Informate anche le persone in modo che trovino le soluzioni più semplici.

4

È possibile trovare il progetto di esempio che ho creato qui.

https://github.com/cyfung/ActivityRecognitionSample

Nota importante: non si può ottenere i dati così frequenti come richiesto!

partire dal API 21, attività può essere ricevuto meno frequentemente rispetto parametro detectionIntervalMillis se il dispositivo è in modalità di risparmio energetico e lo schermo è spento.

componenti chiave:

creare il GoogleApiClient in onCreate

mGoogleApiClient = 
     new GoogleApiClient.Builder(this).addApi(ActivityRecognition.API) 
      .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build(); 

collegare e scollegare il client API in onStart e onStop come suggerito nella documentazione di Google API.

@Override 
    protected void onStart() { 
    super.onStart(); 
    mGoogleApiClient.connect(); 
    mStatusView.setText("connecting"); 
    } 

    @Override 
    protected void onStop() { 
    super.onStop(); 
    mGoogleApiClient.disconnect(); 
    mStatusView.setText("disconnected"); 
    } 

riconoscimento di attività di avvio (non dovrebbe essere chiamato prima che Google Api connect). Utilizzare PendingIntent.getService per creare l'intento in sospeso come richiamata.

final PendingResult<Status> 
    statusPendingResult = 
    ActivityRecognition.ActivityRecognitionApi 
     .requestActivityUpdates(mGoogleApiClient, DETECT_INTERVAL, PendingIntent 
      .getService(this, 0, new Intent(this, ActivityDetectionService.class), 
          PendingIntent.FLAG_UPDATE_CURRENT)); 
statusPendingResult.setResultCallback(this); 

IntentService è il metodo standard suggerito di callback per

public class ActivityDetectionService extends IntentService { 

    protected static final String TAG = "activityDetectionService"; 

    public ActivityDetectionService() { 
    super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    final ActivityRecognitionResult 
     activityRecognitionResult = 
     ActivityRecognitionResult.extractResult(intent); 
    if (activityRecognitionResult == null) { 
     return; 
    } 

    //process the result here, pass the data needed to the broadcast 
    // e.g. you may want to use activityRecognitionResult.getMostProbableActivity(); instead 
    final List<DetectedActivity> 
     probableActivities = 
     activityRecognitionResult.getProbableActivities(); 

    sendBroadcast(MainActivity.newBroadcastIntent(probableActivities)); 
    } 
} 

Registrare il servizio nel manifesto.

<service 
      android:name=".ActivityDetectionService" 
      android:exported="false"> 
    </service> 

Per utilizzare l'API, è necessario aggiungere anche i seguenti in manifest.

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>

<meta-data 
       android:name="com.google.android.gms.version" 
       android:value="@integer/google_play_services_version" /> 

Per tornare i dati all'attività ho usato una BroadcastReceiver creata in onCreate

mBroadcastReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
    ... 
    } 
} 

registro e annullare la registrazione in onResume e rispettivamente.

@Override 
    protected void onResume() { 
    super.onResume(); 
    registerReceiver(mBroadcastReceiver, newBroadcastIntentFilter()); 
    } 

    @Override 
    protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(mBroadcastReceiver); 
    } 
+0

È molto impreciso. Dice in_vehicle/bike quando stavo camminando. – steve

+0

per questo, davvero non posso aiutare, è possibile controllare il codice, io uso solo l'API –

+0

Questo è il problema che ho sollevato e sto affrontando con Google Fit api. – steve