Google Play-tjenester Bruk API-en i nærheten

Introduksjon

En av de mange APIene som er tilgjengelige i Google Play Services, er Nærliggende tilkoblings-API. Introdusert tidlig i 2015, lar dette rammeverket deg sette en enhet som kjører programmet som en vert, og har flere andre enheter koble til den for å kommunisere over en Lokalt nettverk (LAN).

Bruk saker for denne funksjonen inkluderer å koble en telefon til en Android TV for å kontrollere en app og tillate brukere å delta i et flerspillerspill. I denne opplæringen lærer du hvordan du konfigurerer applikasjoner for å koble flere enheter sammen over et nettverk og hvordan du sender data over denne tilkoblingen. En arbeidsprøve for denne opplæringen finner du på GitHub.

1. Prosjektoppsett

Når du har ditt første program opprettet i Android Studio, må du importere Play Services-biblioteket til appen din. For å gjøre dette, plasser du følgende linje av kode under avhengighetskoden til build.gradle fil. På tidspunktet for skrivingen er Play Services 7.5.0 den nyeste versjonen for utvikling.

kompilere 'com.google.android.gms: spill-tjenester: 7.5.0'

Når Play Services er inkludert i appen din, kan du lukke build.gradle og åpne AndroidManifest.xml. Siden denne funksjonen bruker et LAN for å kommunisere, må du inkludere ACCESS_NETWORK_STATE tillatelse i manifestet ditt.

Deretter må du legge til et stykke meta-dataene i applikasjon node som definerer en tjenesteidentifikator som vil bli brukt av appen din, slik at den kan oppdage verter annonsering med samme identifikator. I dette eksemplet er vår serviceidentifikator definert i strings.xml som tutsplus_service_id.

Når du er ferdig med manifestet, kan du flytte til MainActivity.java. Dette er klassen hvor vi skal implementere både reklame og oppdagelse. I Hoved aktivitet, Du vil også kontrollere sending av meldinger mellom ulike enheter.

For å kunne begynne å bruke API-en i nærheten, må du konfigurere og koble til Google API-klienten. Begynn med å implementere ConnectionCallbacks og OnConnectionFailedListener på toppen av klassen din. Mens vi legger til grensesnittene, la vi også inkludere de tre som trengs av API og en OnClickListener.

offentlig klasse MainActivity utvider AppCompatActivity implementerer GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, Connections.ConnectionRequestListener, Connections.MessageListener, Connections.EndpointDiscoveryListener, View.OnClickListener ... 

La oss nå opprette medlemsvariablene som vi trenger for denne opplæringen øverst på siden Hoved aktivitet klasse. For korthetens skyld skal jeg bare nevne at oppsettet for denne klassen består av a Listevisning for å vise meldinger, en EditText feltet med a Knapp for å sende meldinger etter tilkobling, a Knapp for annonsering, tilkobling eller frakobling, avhengig av enhetens rolle, og a TextView for visning av grunnleggende statsinformasjon.

Du vil legge merke til at det er to boolske flagg for å angi hvorvidt enheten ikke er tilkoblet, og hvis det er forbindelsesverten, GoogleApiClient det er nødvendig for å bruke API'en for nærliggende tilkoblinger, og en rekke heltal for å holde oversikt over nettverkstilkoblingstyper vi vil støtte for denne API.

privat GoogleApiClient mGoogleApiClient; privat spinner mTypeSpinner; privat tekstvisning mStatusText; privat knapp mConnectionButton; privat knapp mSendButton; privat Listevisning mListView; Private ViewGroup mSendTextContainer; privat EditText mSendEditText; privat ArrayAdapter mMessageAdapter; privat booleansk mIsHost; private booleanske mIsConnected; Private String mRemoteHostEndpoint; privat liste mRemotePeerEndpoints = ny ArrayList(); privat statisk endelig lang CONNECTION_TIME_OUT = 10000L; privat statisk int [] NETWORK_TYPES = ConnectivityManager.TYPE_WIFI, ConnectivityManager.TYPE_ETHERNET;

Hvis du har jobbet med noen Android Google API-klasser før, må den siste delen av oppsettet se ganske kjent ut. Du må initialisere GoogleApiClient og koble til den i onCreate.

mGoogleApiClient = ny GoogleApiClient.Builder (dette) .addConnectionCallbacks (denne) .addOnConnectionFailedListener (denne) .addApi (Nearby.CONNECTIONS_API) .build ();

I onStart og onStop, Vi håndterer tilkobling og frakobling.

@Override protected void onStart () super.onStart (); mGoogleApiClient.connect ();  @Override protected void onStop () super.onStop (); hvis (mGoogleApiClient! = null && mGoogleApiClient.isConnected ()) mGoogleApiClient.disconnect (); 

2. Annonsering og godkjenning av tilkoblinger

Når du har koblet deg til Google API-klienten, kan du begynne å jobbe med nærliggende forbindelser. Den første komponenten vi skal gå over er reklame, som tillater en enhet å påta seg verten som vert og administrere forbindelser mellom ulike jevnaldrende for kommunikasjon.

Annonsering selv er ganske grei. Du må bare kontrollere at enheten har en akseptabel type tilkobling og deretter ringe Nearby.Connections.StartAdvertising med de riktige parametrene. Dette vil føre til at enheten annonserer over ditt LAN at den er tilgjengelig for å godta tilkoblinger fra andre applikasjoner.

I dette eksemplet passerer vi i en timeout på ti sekunder for annonsering. Du kan imidlertid passere i en verdi av 0 å annonsere på ubestemt tid I følgende kode, isConnectedToNetwork er en hjelpemetode som skal sjekke om reklame skal skje.

privat ugyldig annonsering () hvis (! isConnectedToNetwork ()) returnerer; Strengenavn = "Nærliggende annonsering"; I nærheten.Connections.startAdvertising (mGoogleApiClient, navn, null, CONNECTION_TIME_OUT, dette) .setResultCallback (nytt resultatCallback() @Overtrid offentlig tomgang onResult (Connections.StartAdvertisingResult resultat) if (result.getStatus (). IsSuccess ()) mStatusText.setText ("Advertising"); );  privat boolsk isConnectedToNetwork () ConnectivityManager connManager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); for (int networkType: NETWORK_TYPES) ​​NetworkInfo info = connManager.getNetworkInfo (networkType); hvis (info! = null && info.isConnectedOrConnecting ()) return true;  returnere false; 

Når vertsprogrammet ditt er annonsert, vil det kunne motta tilkoblingsforespørsler fra jevnaldrende. Når en enhet forsøker å koble til, blir følgende metode kalt:

offentlig ugyldig onConnectionRequest (final String remoteEndpointId, siste String remoteDeviceId, siste String remoteEndpointName, byte [] nyttelast)

Ved hjelp av denne metoden kan du enten godta eller avvise forbindelsen. For å godta forespørselen, ringer du Nearby.Connections.acceptConnectionRequest med en ResultsCallback. Du kan da utføre handlinger, avhengig av om tilkoblingen er vellykket eller ikke.

For dette eksempelet legger vi ganske enkelt til det eksterne sluttpunktet til en liste for å holde oversikt over det og kringkaste til alle tilknyttede e-lister som denne nye enheten har koblet til. Hvis du av en eller annen grunn bestemmer at enheten ikke skal koble til søknaden din, kan du avvise den ved å ringe Nearby.Connections.rejectConnectionRequest.

@Override public void onConnectionRequest (finalestring remoteEndpointId, finalestring remoteDeviceId, finalestring remoteEndpointName, byte [] nyttelast) if (mIsHost) Nearby.Connections.acceptConnectionRequest (mGoogleApiClient, remoteEndpointId, nyttelast, dette) .setResultCallback() @Override public void onResult (Status status) if (status.isSuccess ()) hvis (! MRemotePeerEndpoints.contains (remoteEndpointId)) mRemotePeerEndpoints.add (remoteEndpointId);  mMessageAdapter.add (remoteDeviceId + "connected!"); mMessageAdapter.notifyDataSetChanged (); sendMessage (remoteDeviceId + "connected!"); mSendTextContainer.setVisibility (View.VISIBLE); );  else Nearby.Connections.rejectConnectionRequest (mGoogleApiClient, remoteEndpointId); 

3. Oppdagelse

Akkurat som reklame, bygger oppdagelsen på å være koblet til GoogleApiClient og ha en akseptabel nettverksforbindelse. Du kan starte oppdagelsen ved å sende programmets serviceidentifikator inn i Nearby.Connections.startDiscovery metode, som setter brukerens enhet i oppdagelsesmodus.

Når enheten registrerer en vert som for øyeblikket annonserer ved hjelp av den forhåndsdefinerte tjenestidentifikatoren, vil onEndpointFound tilbakeringing vil bli utløst. Det skal bemerkes at denne metoden kan kalles flere ganger hvis det er flere verter som sendes. I denne situasjonen kan du opprette en dialog for dine brukere som viser alle tilgjengelige verter, slik at de kan velge hvilke de vil være koblet til.

For dette eksempelet antar vi at det kun er én vertreklame om gangen, så vi ber omgående å koble til ved å ringe Nearby.Connections.sendConnectionRequest. Hvis forbindelsen er akseptert eller avvist av verten, vil sendConnectionRequest Resultat tilbakeringing vil bli kalt. Hvis tilkoblingen er akseptert, blir statusen satt til vellykket, og vi kan lagre vertsendipunktidentifikatoren og forberede seg på å sende meldinger over tilkoblingskanalen.

privat ugyldig oppdag () hvis (! isConnectedToNetwork ()) returnerer; String serviceId = getString (R.string.service_id); Nærliggende.Connections.startDiscovery (mGoogleApiClient, serviceId, 10000L, dette) .setResultCallback (nytt resultatCallback() @Overtrid offentlig tomgang onResult (Status status) hvis (status.isSuccess ()) mStatusText.setText ("Discovering");  else Log.e ("TutsPlus", "Discovering failed:" + status.getStatusMessage ()); );  @Override public void onEndpointFound (String endpointId, String deviceId, endelig String serviceId, String endpointName) byte [] nyttelast = null; I nærheten.Connections.sendConnectionRequest (mGoogleApiClient, deviceId, endpointId, nyttelast, nye Connections.ConnectionResponseCallback () @Overtrid offentlig tomgang onConnectionResponse (String endpointId, Status status, byte [] bytes) if (status.isSuccess ()) mStatusText. setText ("Koblet til:" + endpointId); Nærliggende.Konnections.stopDiscovery (mGoogleApiClient, serviceId); mRemoteHostEndpoint = endpointId; mSendTextContainer.setVisibility (View.VISIBLE); hvis (! mIsHost) mIsConnected = true; annet mStatusText .setText ("Connection to" + endpointId + "failed"); hvis (! mIsHost) mIsConnected = false;, dette); 

I en situasjon der du lytter etter flere endepunkter for å presentere et valg for brukerne, onEndpointLost Metoden vil gi deg beskjed hvis en vert har sluttet å annonsere før brukeren har forsøkt å koble til den. De onDisconnected tilbakeringing er også tilgjengelig for klientenheter og kan brukes til å koble til annonseringsverter i tilfelle en uventet frakobling.

4. Sende meldinger

Når enhetene dine har 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 når det gjelder TCP (Transmission Control Protocol) og UDP (User Datagram Protocol). En forenklet forklaring er at pålitelige meldinger vil forsøke å forsøke å sende en melding hvis de mislykkes, mens upålitelige meldinger vil ganske enkelt slette dataene hvis den ikke sendes og mottas.

For denne opplæringen vil du bruke pålitelige meldinger. Når en melding er mottatt over API, onMessageReceived vil bli kalt. Denne metoden aksepterer endepunktsidentifikatoren, en nyttelast og en boolsk indikasjon om forbindelsen er pålitelig eller upålitelig. Lastbelastningen inneholder meldingen og endepunktsidentifikatoren er identifikatoren for hvilken enhet som sendte meldingen.

I prøveapplikasjonen vil du bruke dette til å vise nyttelastet som en streng i en Listevisning og hvis enheten er verten, rebroadcast den ut til hver tilkoblet enhet.

@Override public void onMessageReceived (String endpointId, byte [] nyttelast, boolean isReliable) mMessageAdapter.add (ny String (nyttelast)); mMessageAdapter.notifyDataSetChanged (); hvis (mIsHost) sendMessage (ny streng (nyttelast)); 

De sende melding Metode er en hjelpemetode som demonstrerer to versjoner av Nearby.Connections.sendReliableMessage. For vertsapplikasjoner, sendReliableMessage Vil godta en liste over endepunkter for å sende meldingen til. Dette lar deg kommunisere med flere enheter med en linje med kode. For klienter må meldinger bare gå til verten, så bare vertsnavnet er nødvendig som en parameter med GoogleApiClient og melding byte array.

privat tomt 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:" + melding) .getBytes ()); 

5. Koble fra

Når du er klar til å koble fra på verts- eller klientsiden av applikasjonen, er det litt opprydding som må skje. For verter må du slutte å annonsere og koble fra alle endepunktene dine.

I prøvekoden vil du legge merke til at det også sendes en melding som forsøker å la jevnaldrende vite at verten har koblet seg fra. I en mer komplett app vil du at kundene dine skal lytte etter denne typen melding slik at de kan håndtere situasjonen på riktig måte.

Hvis du prøver å koble fra på en klient som ikke har koblet seg til en vert ennå, trenger du bare å stoppe oppdagelsen. Hvis du allerede har koblet til en vert, ringer du disconnectFromEndpoint og API-en vil håndtere å koble til forbindelsen.

privat ugyldigkobling () hvis (! isConnectedToNetwork ()) returnerer; hvis (mIsHost) sendMessage ("Slå av verten"); Nearby.Connections.stopAdvertising (mGoogleApiClient); Nearby.Connections.stopAllEndpoints (mGoogleApiClient); mIsHost = false; mStatusText.setText ("Ikke tilkoblet"); mRemotePeerEndpoints.clear ();  annet hvis (! mIsConnected || TextUtils.isEmpty (mRemoteHostEndpoint)) Nearby.Connections.stopDiscovery (mGoogleApiClient, getString (R.string.service_id)); komme tilbake;  sendMessage ("Koble fra"); Nearby.Connections.disconnectFromEndpoint (mGoogleApiClient, mRemoteHostEndpoint); mRemoteHostEndpoint = null; mStatusText.setText ("Frakoblet");  mIsConnected = false; 

Konklusjon

I denne opplæringen har du lært hvordan du implementerer kommunikasjon mellom ulike Android-enheter over et lokalnettverk ved hjelp av API-en for nærliggende forbindelser. Du bør nå kunne forbedre dine egne apper ved å koble sammen enheter og holde dem synkronisert gjennom ulike oppdateringer til hverandre.

Mens denne opplæringen gikk gjennom et ganske enkelt chatprogram, kan du ta det du har lært her for å lage polerte multiplayeropplevelser, gi sekundære skjermbilder for brukere, eller få appene dine mer kontekstbevisste ved å gi en ekstra kommunikasjonskanal for miljøet. rundt dem.

Siden API'en for nærliggende tilkoblinger fortsetter å vokse med tillegg av Eddystone beacons og Bluetooth, vil dette vise seg å være en uvurderlig ferdighet å ha når du utvikler Android-applikasjoner.