2016-04-12 16 views
7

Próbuję połączyć moją aplikację z Google Fit. Korzystam z IntentService, która musi wykonać następujące czynności. Pobiera się, gdy mam informacje o krokach. W tym momencie staram się stworzyć GoogleApiClient poprzez wywołanie następującego kodu:Uchwyt GoogleFit w tle w aplikacji na Androida

mClient = new GoogleApiClient.Builder(this) 
     .addApi(Fitness.HISTORY_API) 
     .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) 
     .addScope(new Scope(Scopes.FITNESS_LOCATION_READ_WRITE)) 
     .addConnectionCallbacks(
      new GoogleApiClient.ConnectionCallbacks() { 
       @Override 
       public void onConnected(Bundle bundle) { 
        log.info("FITNESS_API: Connected!!!"); 
        Thread thread = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         insertOrUpdateDataPoints(); 
        } 
        }); 

        thread.start(); 
       } 

       @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.info("FITNESS_API: Connection lost. Cause: Network Lost."); 
        } else if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) { 
        log.info("FITNESS_API: Connection lost. Reason: Service Disconnected"); 
        } 
       } 
      } 
    ).build(); 

mClient.connect(); 

Po utworzeniu zestawu danych i dodanie szczegółów kroki jako elemnets DATAPOINT, synchronizować informacje do Google Fit i zamknąć GoogleApiClient z:

com.google.android.gms.common.api.Status insertStatus = 
    Fitness.HistoryApi.insertData(mClient, dataSet).await(1, TimeUnit.MINUTES); 

    // Before querying the data, check to see if the insertion succeeded. 
    if (!insertStatus.isSuccess()) { 
    log.info("FITNESS_API: There was a problem inserting the dataset. Status = " + insertStatus.getStatusCode()); 
    } 

    mClient.disconnect(); 
    mClient = null; 

Problem polega na tym, że próbując samodzielnie zarządzać GoogleApiClient (bez opcji enableAutoManage), nie pojawia się monit o zezwolenie aplikacji na publikowanie danych w Google Fit. To zachowanie zmienia się, jeśli używam funkcji enableAutoManage podczas tworzenia aplikacji GoogleApiClient. Jednakże, aby włączyćAutoManage dla klienta, muszę mieć ActivityFragment ze względu na parametry wymagane przez enableAutoManage. Nie mam dostępu do ActivityFragment w IntentyService i chcę, aby zarządzanie klientem i operacją wstawiania działało w osobnej usłudze, która może działać w tle.

Również, gdy nie używam funkcji enableAutoManage, mimo że zarejestrowałem wywołanie zwrotne połączenia dla GoogleApiClient, nic się nie dzieje.

Jak mogę upewnić się, że moja aplikacja wyświetla monit o zezwolenie aplikacji na publikowanie w Google Fit? Potrzebuję tego, jeśli aplikacja nie ma uprawnień do publikowania w Google Fit, gdy użytkownik otwiera aplikację. Jakieś pomysły? Dziękuję Ci.

Odpowiedz

1

Znalazłem rozwiązanie.

Jeśli nie chcesz korzystać z „enableAutoManage”, trzeba zarejestrować onConnectionFailed metodę tak:

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    if(!authInProgress) { 
     try { 
      authInProgress = true; 
      connectionResult.startResolutionForResult(MainActivity.this, REQUEST_OAUTH); 
     } catch(IntentSender.SendIntentException e) { 

     } 
    } else { 
     Log.e("GoogleFit", "authInProgress"); 
    } 
} 

Ten zaprezentuje okno.

0

W swojej usłudze intencji użyj powyższej metody wymienionej przez @Vlad. Utwórz powiadomienie (Przyklejone lub inne, w zależności od ważności), prosząc użytkownika, aby udzielił Ci pozwolenia, gdy napotkano błąd onconnection. Powiadomienie przekieruje użytkownika do działania, w którym prosi się użytkownika o ponowne sprawdzenie pasowania.

0
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_OAUTH: 
      if (resultCode != Activity.RESULT_OK) { 
       return; 
      } 

      if (!googleApiClient.isConnected()) { 
       googleApiClient.connect(GoogleApiClient.SIGN_IN_MODE_OPTIONAL); 
      } else { 
       readDataTask(); 
      } 
      return; 
     case RC_SIGN_IN: 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       GoogleSignInAccount account = result.getSignInAccount(); 
       String email = account.getEmail();//you can get OAuth user's email AT THIS POINT. 

       if (GoogleFitService.googleApiClient.isConnected()) { 
        readDataTask(); 
       } 
      } 
    } 
} 

Pierwszy raz, co musisz zrobić, to Oauth Goole accout, a następnie uzyskać swój e-mail.

gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .setAccountName("user's email") 
       .requestScopes(
         new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE), 
         new Scope(Scopes.FITNESS_BODY_READ_WRITE), 
         new Scope(Scopes.FITNESS_NUTRITION_READ_WRITE), 
         new Scope(Scopes.FITNESS_LOCATION_READ_WRITE)) 
       .build(); 

kiedy otrzymujesz dane Google Fit w tle, musisz ustawić Email.