2015-12-15 13 views
5

Voglio aggiungere contatore di passi alla mia app. Ormai sto usando Google fit per misurare il conteggio dei passi dell'utente.È possibile rilevare se l'app Google Fit è installata e utilizzata dall'utente?

I problemi con cui sto affrontando è che non tutti i dispositivi hanno l'app Google Fit installata, e anche se lo fa - non tutti gli utenti si registrano al servizio app (come client).

Così il flusso desiderato:

  1. rilevare se è installato Google fit app.
  2. Se installato, controllare se l'utente è registrato nell'app Google fit.
  3. Se installata e registrata nell'app Google fit, verificare se il supporto del tipo di account utente utilizza i servizi di fitness. (registrazione di dati come passi)
  4. Se tutto sopra ok, controllare se l'utente ha confermato il pop-up `Google fit.

Fondamentalmente voglio controllare se l'utente utilizza app misura (utilizzando tutte le condizioni sopra), se si fallisce, allora utilizzerà il sensore StepCount sul dispositivo (se esiste), se il sensore non esiste lo farà usa gli altri sensori per raggiungere questo obiettivo.

Ecco il codice che sto usando per connettersi con Google Fit API:

private void buildFitnessClient() { 
    // Create the Google API Client 
    mClient = new GoogleApiClient.Builder(getContext()) 
      .addApi(Fitness.HISTORY_API) 
      .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ)) 
      .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. 


          new getFitnessTask().execute(); 
         } 


         @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 
           if (getActivity() != null) { 

            GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), 
              getActivity(), 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; activity; "+ getActivity()); 
            if (getActivity() != null) { 

             authInProgress = true; 
             result.startResolutionForResult(getActivity(), 
               REQUEST_OAUTH); 
            } 
           } catch (IntentSender.SendIntentException e) { 
            Log.e(TAG, 
              "Exception while starting resolution activity", e); 
           } 
          } 
         } 
        } 
      ) 
      .build(); 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    Log.e(TAG, "onActivityResult requestCode=" + requestCode + ", resultCode=" + resultCode); 
    if (requestCode == REQUEST_OAUTH) { 
     authInProgress = false; 
     if (resultCode == Activity.RESULT_OK) { 

      Log.e(TAG, "RESULT_OK"); 
      // Make sure the app is not already connected or attempting to connect 
      if (!mClient.isConnecting() && !mClient.isConnected()) { 
       mClient.connect(); 
      } 
     } else if (resultCode == Activity.RESULT_CANCELED) { 
      Log.e(TAG, "RESULT_CANCELED"); 
     } 
    } 
} 


private class getFitnessTask extends AsyncTask<Void, Void, Integer> { 
    ... 
} 
} 

bisogno del vostro aiuto, ragazzi

Grazie.

+0

Anche io sto affrontando lo stesso problema, qualche soluzione per questo? – shekar

+0

Anche cercare una soluzione per la stessa domanda. per favore pubblica la risposta se l'hai già ricevuta. –

risposta

4

È possibile chiamare getPackageInfo() su PackageManager. Se lancia uno PackageManager.NameNotFoundException significa che l'app non è installata. Se non genera un'eccezione, google fit è installato

private static final String PACKAGE_NAME = "com.google.android.apps.fitness"; 

@CheckResult public boolean fitInstalled() { 
    try { 
     context.getPackageManager().getPackageInfo(PACKAGE_NAME, PackageManager.GET_ACTIVITIES); 
     return true; 
    } catch (PackageManager.NameNotFoundException e) { 
     return false; 
    } 
} 
Problemi correlati