Google Fit is een platform waarmee ontwikkelaars applicaties kunnen bouwen die zijn gericht op gebruikersfitnessgegevens. Een van de hulpmiddelen die Google heeft geboden, is Google Fit voor Android, dat beschikbaar is als pakket in Google Play-services.
Hoewel er veel verschillende API's beschikbaar zijn voor Google Fit, zoals besproken in dit overzichtsartikel van Envato Tuts +, is deze zelfstudie gericht op het gebruik van Google Fit om achtergrondabonnees met een laag stroomverbruik voor sensorgegevens te maken. We onderzoeken hoe Google Play-services kunnen worden gebruikt om fitnessgegevens op te slaan, zodat deze op een later tijdstip kunnen worden geopend.
De opname-API verschilt van de Sensors API doordat de live sensorgegevens niet worden geleverd aan de opname-API, maar dat gegevens eerder online worden opgeslagen om een record van gebruikersactiviteit te bewaren. Deze tutorial bevat een voorbeeldproject, dat je kunt downloaden van GitHub.
Als u Google Fit wilt gebruiken, moet u een OAuth 2.0-client-ID maken en uw toepassing registreren via de Google-ontwikkelaarsconsole. U vindt een gedetailleerde uitleg over het instellen van de Google Developer Console in mijn zelfstudie over de Google Fit Sensors-API.
Zodra uw toepassing is geconfigureerd voor verificatie in de Google-ontwikkelaarsconsole, gebruikt u de pakketnaam die u heeft geregistreerd om een nieuwe Android-app te maken met een minimum SDK van 14 en een lege Activiteit
.
Met de basis Android-app gemaakt, opent u de build.gradle bestand en neem Google Play-services op onder het knooppunt afhankelijkheden en synchroniseer uw app.
compileer 'com.google.android.gms: play-services-fitness: 8.4.0'
U zou nu de benodigde Google Play Services-klassen kunnen opnemen in uw applicatie. Voordat we ingaan op de Java-code voor deze zelfstudie, open je activity_main.xml en pas het aan zodat het er twee bevat Knop
items die zullen worden gebruikt om een deel van de functionaliteit van de opname-API aan te tonen.
Wanneer uw app wordt uitgevoerd, ziet de gebruikersinterface eruit als de onderstaande afbeelding.
Om het opzetten van uw project te voltooien, opent u MainActivity.java en implementeer de volgende callbacks en hun vereiste methoden:
GoogleApiClient.ConnectionCallbacks
GoogleAPiClient.OnConnectionFailedListener
View.OnClickListener
U moet ook de ledvariabelen voor uw klas toevoegen, zoals hieronder weergegeven.
openbare klasse MainActivity breidt AppCompat uitActivity implementeert GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener private Button mCancelSubscriptionsBtn; private Button mShowSubscriptionsBtn; privé ResultCallbackmSubscribeResultCallback; privé ResultCallback mCancelSubscriptionResultCallback; privé ResultCallback mListSubscriptionsResultCallback; privé GoogleApiClient m GoogleApiClient; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); @Override public void onConnected (@Nullable Bundle-bundel) Log.e ("RecordingAPI", "onConnected"); @Override public void onConnectionSuspended (int i) Log.e ("RecordingAPI", "onConnectionSuspended"); @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult) Log.e ("RecordingAPI", "onConnectionFailed"); @Override public void onClick (View v)
Voordat u de callbacks en weergaven die u hierboven hebt gedefinieerd, kunt gebruiken, moet u ze initialiseren. We doen dit door twee hulpmethoden te maken, een voor het initialiseren van de views en een voor het initialiseren van de callbacks die worden aangeroepen onCreate ()
.
De initViews ()
methode wijst op de Knop
objecten naar de gedefinieerde items in activity.xml en stelt een OnClickListener
voor elke knop.
@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); initViews (); initCallbacks (); private void initViews () mCancelSubscriptionsBtn = (Button) findViewById (R.id.btn_cancel_subscriptions); mShowSubscriptionsBtn = (Button) findViewById (R.id.btn_show_subscriptions); mCancelSubscriptionsBtn.setOnClickListener (deze); mShowSubscriptionsBtn.setOnClickListener (deze);
In initCallbacks ()
, dingen worden een beetje interessanter. Elke callback wordt gebruikt voor een specifieke asynchrone bewerking van de opname-API. Zoals hun namen impliceren, mSubscribeResultCallback
wordt aangeroepen wanneer u voor het eerst een abonnement voor een sensor toevoegt, mCancelSubscriptionResultCallback
wordt gebeld wanneer u dat abonnement opzegt, en mListSubscriptionResultCallback
wordt gebruikt wanneer u een lijst met alle abonnementen oproept.
In het volgende codefragment registreren de twee callbacks die betrekking hebben op het starten en stoppen van een abonnement alleen een succes of mislukking. mListSubscriptionResultCallback
ontvangt een lijst met abonnementen en log uit informatie over elk van hen door de Data type
en dan elk Veld
geassocieerd met het abonnement.
private void initCallbacks () mSubscribeResultCallback = new ResultCallback() @Override public void onResult (@NonNull Status-status) if (status.isSuccess ()) if (status.getStatusCode () == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) Log.e ("RecordingAPI", "Al geabonneerd op de opname-API "); else Log.e ("RecordingAPI", "Subscribed to the Recording API"); ; mCancelSubscriptionResultCallback = new ResultCallback () @Override public void onResult (@NonNull Status-status) if (status.isSuccess ()) Log.e ("RecordingAPI", "Cancelled subscriptions!"); else // Abonnement niet verwijderd Log.e ("RecordingAPI", "Annuleren van abonnementen mislukt"); ; mListSubscriptionsResultCallback = new ResultCallback () @Override public unfid onResult (@NonNull ListSubscriptionsResult listSubscriptionsResult) for (Abonnementsabonnement: listSubscriptionsResult.getSubscriptions ()) DataType dataType = subscription.getDataType (); Log.e ("RecordingAPI", dataType.getName ()); for (Field field: dataType.getFields ()) Log.e ("RecordingAPI", field.toString ()); ;
Nu u het algemene framework voor uw voorbeeld-app bij elkaar hebt, is het tijd om alles in te pakken door verbinding te maken met Google Play-services en om abonnementen aan te vragen.
In onCreate ()
, u kunt initialiseren en verbinding maken met Google Play-services door te verklaren dat u deze gebruikt Fitness.RECORDING_API
, een ruimte toevoegen voor het lezen van fitnessactiviteitsgegevens en instellen dat deze automatisch wordt verbonden / ontkoppeld via de levenscyclus van de toepassing.
mGoogleApiClient = nieuwe GoogleApiClient.Builder (dit) .addApi (Fitness.RECORDING_API) .addScope (nieuwe scope (Scopes.FITNESS_ACTIVITY_READ)) .addConnectionCallbacks (this) .enableAutoManage (this, 0, this) .build ();
Op elk moment na de GoogleApiClient
heeft verbonden, kunt u een abonnement aanvragen. Voor deze zelfstudie melden we ons aan onConnected ()
. Het volgende fragment laat zien hoe u een abonnement kunt starten voor wijzigingen in het aantal stappen van de gebruiker, hoewel u toegang hebt tot elke sensor die Google Fit ondersteunt.
Als een abonnement al wordt uitgevoerd vanwege een eerdere actie, ontvangt de callback een statuscode van FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED
.
@Override public void onConnected (@Nullable Bundle-bundel) Fitness.RecordingApi.subscribe (mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA) .setResultCallback (mSubscribeResultCallback);
Het kan soms handig zijn om een lijst met abonnementen aan te vragen. U hebt eerder twee knoppen voor deze bewerkingen gemaakt. In de bij klikken()
methode, controleert u op welke knop is getikt en voert u de bijbehorende actie uit.
@Override public void onClick (View v) switch (v.getId ()) case R.id.btn_cancel_subscriptions: cancelSubscriptions (); breken; case R.id.btn_show_subscriptions: showSubscriptions (); breken;
Als showSubscriptions ()
wordt aangeroepen, vraagt de toepassing een lijst met abonnementen aan die is gekoppeld aan de opname-API.
private void showSubscriptions () Fitness.RecordingApi.listSubscriptions (mGoogleApiClient) .setResultCallback (mListSubscriptionsResultCallback);
Dit veroorzaakt mListSubscriptionsResultCallback
om alle verbonden abonnementen uit te loggen. Het resultaat ziet er ongeveer zo uit:
... /com.tutsplus.googlefitrecordingapi E / RecordingAPI: com.google.step_count.delta ... /com.tutsplus.googlefitrecordingapi E / RecordingAPI: stappen (i)
Het annuleren van een abonnement is eenvoudig, zoals u hieronder kunt zien.
private void cancelSubscriptions () Fitness.RecordingApi.unsubscribe (mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA) .setResultCallback (mCancelSubscriptionResultCallback);
U moet nu een basiskennis hebben van hoe u vanuit een Android-app verbinding kunt maken met Google Fit en met de opname-API kunt werken. Hoewel dit op dit moment niet zo veel lijkt, maakt het de weg vrij voor u om informatie over de fysieke activiteiten van de gebruiker op te slaan, zodat deze door andere Google Fit API's kunnen worden geopend binnen uw applicatie.