Google Play Services: Bruke nærliggende Tilkoblinger API
20
Del
50
Del
Denne Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Innledning
En av de mange programmeringsgrensesnitt som er tilgjengelige i Google Play Services er i nærheten Connections API. Introdusert i begynnelsen av 2015, kan denne rammen du angi en enhet som kjører programmet som vert og har flere andre enheter koble seg til det for å kommunisere over et lokalt nettverk (LAN).
Bruk saker for denne funksjonen inkluderer å koble en telefon til en Android-TV for å styre en app og tillater brukere å delta i et flerspillerspill. I denne opplæringen vil du lære hvordan du setter opp programmer for å koble flere enheter sammen over et nettverk og hvordan du sender data over denne forbindelsen. En arbeidsgruppe prøve for denne opplæringen kan bli funnet på GitHub.
1. Prosjektoppsett
Når du har din første program laget i Android Studio, må du importere Play Services bibliotek i appen. For å gjøre dette, plasserer du følgende kodelinje under avhengigheten node i build.gradle filen. I skrivende stund, Play Services 7.5.0 er den nyeste utgaven for utvikling
kompilere. Com.google.android.gms: play-tjenester: 7.5.0 '
Når Play Services er inkludert i app, kan du lukke build.gradle og åpen AndroidManifest.xml. Siden denne funksjonen bruker et LAN for å kommunisere, må du inkludere ACCESS_NETWORK_STATE tillatelse i manifestet
< bruker-tillatelse android. Name = "android.permission.ACCESS_NETWORK_STATE" />
Deretter vil du må legge til en bit av meta-data i søknaden node som definerer en tjeneste identifikator som vil bli brukt av din app slik at den kan oppdage verter annonserer med samme identifikator. I dette eksemplet er vår service-ID definert i strings.xml som tutsplus_service_id
< meta-data android. Name = "com.google.android.gms.nearby.connection.SERVICE_ID" android: value = "@ string /service_id "/>
Når du er ferdig med kompendiet, kan du flytte til MainActivity.java. Dette er den klassen hvor vi vil gjennomføre både reklame og oppdagelse. I MainActivity, vil du også kontrollere å sende meldinger mellom ulike enheter.
For å begynne å bruke tilkoblinger i nærheten API, må du sette opp og koble til Google API Client. Start med å implementere ConnectionCallbacks og OnConnectionFailedListener på toppen av klassen. Mens vi legger våre grensesnitt, la oss inkludere også de tre som er nødvendig av API og en OnClickListener.
Public class MainActivity strekker AppCompatActivity implementerer GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, Connections.ConnectionRequestListener, Connections.MessageListener, Connections. EndpointDiscoveryListener, View.OnClickListener {...
La oss nå lage medlems variabler som vi trenger for denne opplæringen på toppen av MainActivity klassen. For enkelhets skyld, vil jeg bare nevne at oppsettet for denne klassen består av en Listview for visning av meldinger, en EditText feltet med en knapp for å sende meldinger etter oppkoblet, en knapp for reklame, tilkobling eller frakobling, avhengig av enhetens rolle, og en TextView for å vise grunnleggende informasjon om stat.
Du vil merke at det er to boolske flagg for utpeking været eller ikke enheten er koblet, og hvis det er sammenhengen verten, GoogleApiClient som er nødvendig for bruk av nærliggende Connections API, og en rekke heltall for å holde styr på nettverkstilkoblingstypene vi vil støtte for dette API
privat GoogleApiClient mGoogleApiClient;. privat Spinner mTypeSpinner, privat TextView mStatusText, privat Button mConnectionButton, privat Button mSendButton; privat Listview mListView, privat ViewGroup mSendTextContainer, privat EditText mSendEditText, privat ArrayAdapter < String > mMessageAdapter, private boolean mIsHost, private boolean misconnected, private String mRemoteHostEndpoint, privat List < String > mRemotePeerEndpoints = new Arraylist < String > (), private static lang slutt CONNECTION_TIME_OUT = 10000L, private static int [] NETWORK_TYPES = {ConnectivityManager.TYPE_WIFI, ConnectivityManager.TYPE_ETHERNET};
Hvis du har jobbet med noen Android Google API klasser før , den siste bit av oppsett bør se ganske kjent. Du må initialisere GoogleApiClient og koble til det i onCreate
mGoogleApiClient = new GoogleApiClient.Builder (denne) .addConnectionCallbacks (denne) .addOnConnectionFailedListener (denne) .addApi (Nearby.CONNECTIONS_API) att bygga ();.
i onStart og onStop håndterer vi tilkobling og frakobling
Overrideprotected ugyldig onStart () {super.onStart (.); mGoogleApiClient.connect ();} @ Overrideprotected ugyldig onStop () {super.onStop (); if (mGoogleApiClient = null &! & mGoogleApiClient.isConnected ()) {mGoogleApiClient.disconnect (); }}
2. Reklame og godta tilkoblinger
Når du har koblet til Google API Client, kan du begynne å jobbe med nærliggende tilkoblinger. Den første komponenten vil vi gå over er reklame, som gjør at en enhet for å påta seg rollen som vert for og administrere forbindelser mellom ulike jevnaldrende for kommunikasjon.
Reklame i seg selv er ganske grei. Du trenger bare å kontrollere at enheten har en akseptabel tilkoblingstype og deretter ringe Nearby.Connections.StartAdvertising med de riktige parameterne. Dette vil føre til at enheten annonsere på lokalnettet at den er tilgjengelig for å godta tilkoblinger fra andre programmer.
I dette eksempelet går vi i en timeout på ti sekunder for annonsering. Du kan imidlertid passere i en verdi fra 0 til annonsere på ubestemt tid. I det følgende kode, er isConnectedToNetwork en hjelper metode ment å sjekke om annonsering skal skje
private void annonsere () {if retur. (IsConnectedToNetwork ()!); String name = "nærliggende Advertising"; Nearby.Connections.startAdvertising (mGoogleApiClient, navn, null, CONNECTION_TIME_OUT, dette) .setResultCallback (ny ResultCallback < Connections.StartAdvertisingResult >. () {Override Public void onResult (Connections.StartAdvertisingResult resultat) {if (result.getStatus () isSuccess ()) {mStatusText.setText ( "Reklame");}}});} private boolean isConnectedToNetwork () {ConnectivityManager connManager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); for (int networkType: NETWORK_TYPES) {NetworkInfo info = connManager.getNetworkInfo (networkType); if (info = null &! & info.isConnectedOrConnecting ()) {return true; }} Return false;}
Når vertsprogrammet er reklame, vil det være i stand til å motta tilkoblingsforespørsler fra jevnaldrende. Når en enhet prøver å koble til, vil følgende metode kalles:
public void onConnectionRequest (endelig String remoteEndpointId, slutt String remoteDeviceId, slutt String remoteEndpointName, byte [] nyttelast)
Ved hjelp av denne metoden, kan du enten godta eller avvise forbindelsen. For å godta forespørselen, kaller du Nearby.Connections.acceptConnectionRequest med en ResultsCallback. Du kan deretter utføre handlinger, avhengig av om tilkoblingen er akseptert eller ikke.
I dette eksemplet vil vi bare legge det eksterne endepunktet til en liste for å holde orden på det og kringkastet til alle tilkoblede jevnaldrende som denne nye enheten er tilkoblet. Om for noen grunn, bestemmer du at enheten ikke skal kobles til søknaden din, kan du avvise den ved å ringe Nearby.Connections.rejectConnectionRequest.
Overridepublic Void onConnectionRequest (endelig String remoteEndpointId, slutt String remoteDeviceId, slutt String remoteEndpointName, byte [] nyttelast) {if (mIsHost) {Nearby.Connections.acceptConnectionRequest (mGoogleApiClient, remoteEndpointId, nyttelast, dette) .setResultCallback (ny ResultCallback < status > () {Override public void onResult (status status) {if (status. isSuccess ()) {if) {mRemotePeerEndpoints.add (remoteEndpointId) (mRemotePeerEndpoints.contains (remoteEndpointId!);} mMessageAdapter.add (remoteDeviceId + "connected!"); mMessageAdapter.notifyDataSetChanged (); Sendmessage (remoteDeviceId + "! tilkoblet" ), mSendTextContainer.setVisibility (View.VISIBLE); }}}); } Else {Nearby.Connections.rejectConnectionRequest (mGoogleApiClient, remoteEndpointId); }}
3. Discovery
Akkurat som reklame, er avhengig funn på å være koblet til GoogleApiClient og ha en akseptabel nettverkstilkobling. Du kan starte oppdagelsen ved å sende applikasjonstjenesten identifikator inn i Nearby.Connections.startDiscovery metoden, som setter din brukerens enhet i oppdagelsesmodus.
Når enheten oppdager en maskin som er i ferd med reklame ved hjelp av forhåndsdefinerte tjenesten identifikator, den onEndpointFound tilbakeringing vil bli utløst. Det skal bemerkes at denne metoden kan kalles flere ganger dersom det er flere verter kringkasting. I denne situasjonen, kan du opprette en dialog for brukerne som viser alle tilgjengelige verter, slik at de kan velge hvilke de ønsker å være koblet til.
For dette eksempelet, vil vi anta at det er bare én vert annonsering på en gang, så vi vil umiddelbart be om å koble ved å ringe Nearby.Connections.sendConnectionRequest. Hvis tilkoblingen er akseptert eller avvist av verten, vil sendConnectionRequest resultat tilbakeringing bli kalt. Hvis tilkoblingen er akseptert, vil status settes til vellykket og vi kan lagre verten endepunkt identifikator og forberede seg på å sende meldinger over forbindelsen kanalen
private void oppdage () {if retur. (IsConnectedToNetwork ()!); String serviceId = getString (R.string.service_id); Nearby.Connections.startDiscovery (mGoogleApiClient, serviceId, 10000L, dette) .setResultCallback (ny ResultCallback < Status > () {Override public void onResult (Status status) {if (status.isSuccess ()) {mStatusText.setText ( "Discovering ");} else {Log.e (" TutsPlus "," Discovering mislyktes: "+ status.getStatusMessage ());}}});} @ Overridepublic ugyldig onEndpointFound (String endpointId, String DeviceID, slutt String serviceId, String endpointName ) {byte [] nyttelast = null; Nearby.Connections.sendConnectionRequest (mGoogleApiClient, DeviceID, endpointId, nyttelast, ny Connections.ConnectionResponseCallback () {Override public void onConnectionResponse (String endpointId, Status status, byte [] bytes) {if (status.isSuccess ()) {mStatusText. setText ( "Koblet til:" + endpointId), (! mIsHost) Nearby.Connections.stopDiscovery (mGoogleApiClient, serviceId); mRemoteHostEndpoint = endpointId;; mSendTextContainer.setVisibility (View.VISIBLE) hvis {misconnected = true;}} else {mStatusText .setText ( «Tilkobling til" + endpointId + "feilet"); if (mIsHost!) {misconnected = false;}}}}, dette);}
i en situasjon hvor du lytte etter flere endepunkter å presentere et utvalg for brukerne, vil onEndpointLost metoden gi deg beskjed hvis en vert har stoppet reklame før brukeren har forsøkt å koble til det. Den onDisconnected tilbakeringing er også tilgjengelig for klientenheter og kan brukes for å koble til reklame vertene i tilfelle en uventet frakobling.
4. Sende meldinger
Når enhetene er koblet sammen, er det på tide å begynne å kommunisere. Det finnes to typer meldinger som kan sendes, pålitelig og upålitelig. Hvis du er kjent med nettverksteknologi, kan du tenke på disse i form av TCP (Transmission Control Protocol) og UDP (User Datagram Protocol). En forenklet forklaring er at pålitelige meldinger vil prøve på nytt forsøk på å sende en melding hvis de mislykkes, mens upålitelige meldinger vil bare slippe data dersom det ikke er sendt og mottatt.
For denne opplæringen, vil du bruke pålitelige meldinger . Når en melding er mottatt over API, vil onMessageReceived bli kalt. Denne metoden godtar endepunkt identifikator, en nyttelast, og en boolsk verdi som angir om tilkoblingen er pålitelig eller upålitelig. Nyttelasten inneholder meldingen og endepunktet identifikator er identifikatoren av hvilken enhet sendte meldingen.
I prøveprogrammet, vil du bruke dette for å vise nyttelasten som en streng i en Listview og hvis enheten er verten, sendt i reprise det ut til alle tilkoblede enheten
Overridepublic ugyldig onMessageReceived (String endpointId, byte [] nyttelast, boolean isReliable) {mMessageAdapter.add (new String (nyttelast).); mMessageAdapter.notifyDataSetChanged (); if (mIsHost) {Sendmessage (new String (nyttelast)); }}
Sendmessage metoden er en hjelper metode som viser to versjoner av Nearby.Connections.sendReliableMessage. For vertsprogrammer, vil sendReliableMessage godta en liste over endepunktene for å sende meldingen til. Dette gjør det mulig å kommunisere til flere enheter med én linje med kode. For kunder, meldinger trenger bare å gå til verten, så bare vertsnavnet er nødvendig som en parameter med GoogleApiClient og meldingen byte array.
Private void Sendmessage (String melding) {if (mIsHost) {Nearby.Connections. sendReliableMessage (mGoogleApiClient, mRemotePeerEndpoints, message.getBytes ()); mMessageAdapter.add (melding); mMessageAdapter.notifyDataSetChanged (); } Else {Nearby.Connections.sendReliableMessage (mGoogleApiClient, mRemoteHostEndpoint, (Nearby.Connections.getLocalDeviceId (mGoogleApiClient) + "sier:" + message) .getBytes ()); }}
5. Frakobling
Når du er klar til å koble på enten vert eller klientsiden av programmet, er det en liten bit av opprydding som må finne sted. For vertene, må du stoppe reklame og koble fra alle dine endepunkter.
I eksempelkoden, vil du legge merke til at en melding sendes også som forsøker å la kolleger vet at verten har koblet fra. I en mer komplett app, vil du ønsker at kundene skal lytte etter denne type budskap slik at de kan håndtere situasjonen riktig.
Hvis du prøver å koble på en klient som ikke har koblet til en verts ennå , trenger du bare å stoppe oppdagelse. Hvis du allerede har koblet til en vert, ringe deg disconnectFromEndpoint og API vil håndtere kutte forbindelsen
private void koble () {if retur. (IsConnectedToNetwork ()!); if (mIsHost) {Sendmessage ( "Slå host"); Nearby.Connections.stopAdvertising (mGoogleApiClient); Nearby.Connections.stopAllEndpoints (mGoogleApiClient); mIsHost = false; mStatusText.setText ( "Ikke tilkoblet"); mRemotePeerEndpoints.clear (); } Else {if {Nearby.Connections.stopDiscovery (mGoogleApiClient, getString (R.string.service_id)) (misconnected || TextUtils.isEmpty (mRemoteHostEndpoint)!); komme tilbake; } Sendmessage ( "Koble"); Nearby.Connections.disconnectFromEndpoint (mGoogleApiClient, mRemoteHostEndpoint); mRemoteHostEndpoint = null; mStatusText.setText ( "frakoblet"); } Misconnected = false;}
Konklusjon
I denne opplæringen, har du lært hvordan å implementere kommunikasjon mellom ulike Android-enheter over et lokalt nettverk med den nærliggende Connections API. Du skal nå kunne for å forbedre dine egne apps ved å koble enhetene sammen og holde dem synkronisert gjennom ulike oppdateringer til hverandre.
Selv om denne opplæringen gikk gjennom en ganske enkel chat-klient program, kan du ta det du har lært her for å opprette polerte flerspilleropplevelser, gi sekundære skjermer for brukere, eller lage dine apps mer kontekstuelt bevisst ved å gi en ekstra kommunikasjonskanal for miljøet rundt dem.
Som tilkoblinger i nærheten API fortsetter å vokse med tillegg av Eddystone sjømerker og Bluetooth, vil dette vise seg å være en uvurderlig ferdighet å ha når utvikle Android-programmer.