Serviciile Google Play utilizând API-ul Connections Nearby

Introducere

Unul dintre API-urile disponibile în serviciile Google Play este API conexiuni în apropiere. Prezentat la începutul anului 2015, acest cadru vă permite să setați un dispozitiv care rulează aplicația dvs. ca gazdă și să aveți mai multe dispozitive conectate la ea pentru a comunica într-o Rețea locală (LAN).

Cazurile de utilizare pentru această funcție includ conectarea unui telefon la un televizor Android pentru controlul unei aplicații și permițând utilizatorilor să participe la un joc multiplayer. În acest tutorial, veți învăța cum să configurați aplicații pentru conectarea mai multor dispozitive împreună la o rețea și cum să trimiteți date prin acea conexiune. Un exemplu de lucru pentru acest tutorial poate fi găsit pe GitHub.

1. Configurarea proiectului

După ce ați creat programul inițial în Android Studio, va trebui să importați biblioteca de servicii Play în aplicația dvs. Pentru aceasta, plasați următoarea linie de cod sub nodul de dependență al build.gradle fişier. În momentul redactării, Play Services 7.5.0 este cea mai recentă versiune pentru dezvoltare.

compile 'com.google.android.gms: play-services: 7.5.0'

Odată ce serviciile de redare sunt incluse în aplicația dvs., puteți închide build.gradle și deschis AndroidManifest.xml. Deoarece această caracteristică utilizează o rețea LAN pentru a comunica, va trebui să includeți ACCESS_NETWORK_STATE permisiune în manifestarea dvs..

Apoi, va trebui să adăugați o bucată de meta-date în cerere nod care definește un identificator de serviciu care va fi utilizat de aplicația dvs. pentru a putea descoperi gazde publicitare cu același identificator. În acest exemplu, identificatorul serviciului nostru este definit în strings.xml la fel de tutsplus_service_id.

Când ați terminat cu manifestul, puteți trece la MainActivity.java. Aceasta este clasa în care vom implementa atât publicitatea, cât și descoperirea. În Activitate principala, veți controla, de asemenea, trimiterea de mesaje între diferite dispozitive.

Pentru a începe să utilizați API-ul Close Connections, trebuie să configurați și să vă conectați la Clientul API Google. Începeți prin implementare ConnectionCallbacks și OnConnectionFailedListener la vârful clasei tale. În timp ce adăugăm interfețele noastre, să includeți și cele trei care sunt necesare de API și una OnClickListener.

public class MainActivity se extinde AppCompatActivity implementează GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, Connections.ConnectionRequestListener, Connections.MessageListener, Connections.EndpointDiscoveryListener, View.OnClickListener ... 

Să creăm acum variabilele membre de care avem nevoie pentru acest tutorial în partea de sus a paginii Activitate principala clasă. Din motive de coincidență, voi menționa pur și simplu că structura pentru această clasă constă în a ListView pentru afișarea mesajelor Editează textul câmp cu Buton pentru trimiterea mesajelor după conectare, a Buton pentru publicitate, conectare sau deconectare, în funcție de rolul dispozitivului și a TextView pentru afișarea informațiilor de bază de stare.

Veți observa că există două steaguri booleene pentru a indica dacă aparatul este conectat și dacă acesta este gazda conexiunii, GoogleApiClient care este necesar pentru utilizarea API-ului Close Connections și o serie de numere întregi pentru urmărirea tipurilor de conexiuni de rețea pe care le vom sprijini pentru acest API.

GoogleApiClient privat mGoogleApiClient; Spinner privat mTypeSpinner; private TextView mStatusText; Butonul de conectare buton privat; butonul privat mSendButton; privat ListView mListView; privat ViewGroup mSendTextContainer; privat EditText mSendEditText; privat ArrayAdapter mMessageAdapter; privat boolean mIsHost; privat boolean mIsConnected; String privat mRemoteHostEndpoint; Lista privată mRemotePeerEndpoints = noul ArrayList(); statică privată finală lungă CONNECTION_TIME_OUT = 10000L; privat static int [] NETWORK_TYPES = ConnectivityManager.TYPE_WIFI, ConnectivityManager.TYPE_ETHERNET;

Dacă ați lucrat mai înainte cu clase Google API pentru Android, ultimul set de configurare ar trebui să pară destul de familiarizat. Trebuie să inițializați GoogleApiClient și conectați-vă la el în onCreate.

mGoogleApiClient = nou GoogleApiClient.Builder (acest) .addConnectionCallbacks (acest) .addOnConnectionFailedListener (acest) .addApi (Nearby.CONNECTIONS_API) .build ();

În onStart și onStop, ne ocupăm de conectare și deconectare.

@Override protejate void onStart () super.onStart (); mGoogleApiClient.connect ();  @Override protejate void onStop () super.onStop (); dacă (mGoogleApiClient! = null && mGoogleApiClient.isConnected ()) mGoogleApiClient.disconnect (); 

2. Publicitatea și acceptarea conexiunilor

După conectarea la clientul Google API, puteți începe să lucrați cu conexiunile din apropiere. Prima componentă pe care o vom trece este reclamă, care permite unui dispozitiv să-și asume rolul de gazdă și să gestioneze conexiunile între diferiți colegi pentru comunicare.

Publicitatea însăși este destul de simplă. Pur și simplu trebuie să verificați dacă dispozitivul are un tip de conexiune acceptabil și apoi apelați Nearby.Connections.StartAdvertising cu parametrii corespunzători. Acest lucru va determina aparatul să facă publicitate în rețeaua LAN că este disponibil pentru acceptarea conexiunilor din alte aplicații.

În acest exemplu, vom trece într-un interval de timp de zece secunde pentru publicitate. Cu toate acestea, puteți trece o valoare de 0 pentru a face publicitate pe termen nelimitat. În următorul cod, isConnectedToNetwork este o metodă de ajutor pentru a verifica dacă ar trebui să apară publicitatea.

private void advertise () if (! isConnectedToNetwork ()) retur; Nume șir = "Publicitate în apropiere"; Nearby.Connections.startAdvertising (mGoogleApiClient, nume, null, CONNECTION_TIME_OUT, acest lucru) .setResultCallback (noul ResultCallback() @Override public void peResult (rezultat Connections.StartAdvertisingResult) if (result.getStatus (). IsSuccess ()) mStatusText.setText ("Publicitate"); );  boolean privat isConnectedToNetwork () ConectivitateManager connManager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); pentru (int rețeaType: NETWORK_TYPES) ​​NetworkInfo info = connManager.getNetworkInfo (networkType); dacă (info! = null && info.isConnectedOrConnecting ()) return true;  return false; 

Odată ce aplicația gazdă va face publicitate, va putea primi solicitări de conectare de la colegii. Când un dispozitiv încearcă să se conecteze, va fi apelată următoarea metodă:

public void onConnectionRequest (ultimul String remoteEndpointId, final String remoteDeviceId, final String remoteEndpointName, byte [] sarcina utila)

Utilizând această metodă, puteți accepta sau respinge conexiunea. Pentru a accepta solicitarea, apelați Nearby.Connections.acceptConnectionRequest cu ResultsCallback. Puteți efectua apoi acțiuni, în funcție de faptul dacă conexiunea este acceptată cu succes sau nu.

Pentru acest exemplu, pur și simplu adăugăm terminalul de la distanță la o listă pentru a ține evidența acestuia și a le transmite tuturor colegilor conectați pe care acest dispozitiv nou le-a conectat. Dacă, din anumite motive, stabiliți că dispozitivul nu trebuie să se conecteze la aplicația dvs., îl puteți respinge apelând Nearby.Connections.rejectConnectionRequest.

@Override public void onConnectionRequest (final String remoteEndpointId, final String remoteDeviceId, final String remoteEndpointName, byte [] sarcina utila) if (mIsHost) Nearby.Connections.acceptConnectionRequest (mGoogleApiClient, remoteEndpointId, payload, this) .setResultCallback() @Override public void onResult (Stare statut) if (status.isSuccess ()) if (! MRemotePeerEndpoints.contains (remoteEndpointId)) mRemotePeerEndpoints.add (remoteEndpointId);  mMessageAdapter.add (remoteDeviceId + "conectat!"); mMessageAdapter.notifyDataSetChanged (); sendMessage (remoteDeviceId + "conectat!"); mSendTextContainer.setVisibility (View.VISIBLE); );  altceva Nearby.Connections.rejectConnectionRequest (mGoogleApiClient, remoteEndpointId); 

3. Discovery

La fel ca publicitatea, descoperirea se bazează pe conectarea la GoogleApiClient și având o conexiune acceptabilă la rețea. Puteți începe descoperirea prin trecerea identificatorului de servicii al aplicației în Nearby.Connections.startDiscovery , care stabilește dispozitivul utilizatorului în modul de descoperire.

Când dispozitivul detectează o gazdă care face publicitate în prezent folosind identificatorul de serviciu predefinit, onEndpointFound inversarea apelului va fi declanșată. Trebuie remarcat faptul că această metodă poate fi apelată de mai multe ori dacă există mai multe gazde de difuzare. În această situație, puteți crea un dialog pentru utilizatorii dvs. care afișează toate gazdele disponibile, astfel încât să poată selecta la care ar dori să fie conectat.

Pentru acest exemplu, vom presupune că există o singură publicitate gazdă la un moment dat, așa că vom solicita imediat să vă conectăm prin apelare Nearby.Connections.sendConnectionRequest. Dacă conexiunea este acceptată sau respinsă de către gazdă, sendConnectionRequest rezultatul apelului de apel rezultat va fi apelat. Dacă conexiunea este acceptată, statutul va fi setat la succes și putem salva identificatorul punctului final al gazdei și se pregătește pentru trimiterea mesajelor pe canalul de conectare.

private void descoperi () if (! isConnectedToNetwork ()) retur; Serviciul StringId = getString (R.string.service_id); Nearby.Connections.startDiscovery (mGoogleApiClient, serviceId, 10000L, acest lucru) .setResultCallback (noul ResultCallback() @Override public void onResult (Stare stare) if (status.isSuccess ()) mStatusText.setText ("Descoperirea");  altceva Log.e ("TutsPlus", "Descoperirea a eșuat:" + status.getStatusMessage ()); );  @Override publice void peEndpointFound (String endpointId, String deviceId, String finitId, String endpointName) byte [] payload = null; Near.Connections.sendConnectionRequest (mGoogleApiClient, deviceId, endpointId, sarcină utilă, noul Connections.ConnectionResponseCallback () @Override public void onConnectionResponse (String endpoint Id, Stare stare, byte [] octeți) if (status.isSuccess ()) mStatusText. setText ("Conectat la:" + endpointId); Nearby.Connections.stopDiscovery (mGoogleApiClient, serviceId); mRemoteHostEndpoint = endpointId; mSendTextContainer.setVisibility (View.VISIBLE); .setText ("Conectarea la" + endpointId + "a eșuat"); dacă (! mIsHost) mIsConnected = false;, aceasta); 

Într - o situație în care ascultați pentru mai multe puncte finale pentru a oferi o alegere pentru utilizatorii dvs., onEndpointLost vă va informa dacă o gazdă a încetat să facă publicitate înainte ca utilizatorul dvs. să încerce să se conecteze la acesta. onDisconnected inversarea apelului este, de asemenea, disponibilă pentru dispozitivele client și poate fi utilizată pentru reconectarea la gazde publicitare în cazul unei deconectări neașteptate.

4. Trimiterea de mesaje

Odată ce dispozitivele dvs. au fost conectate împreună, este timpul să începeți comunicarea. Există două tipuri de mesaje care pot fi trimise, de încredere și nedemn de încredere. Dacă sunteți familiarizați cu tehnologia de rețea, vă puteți gândi la acestea în termeni de TCP (Protocol de control al transmisiei) și UDP (User Datagram Protocol). O explicație simplificată este că mesajele de încredere vor reîncerca încercările de trimitere a unui mesaj dacă acestea nu reușesc, în timp ce mesajele nesigure vor pur și simplu să renunțe la date dacă nu sunt trimise și primite cu succes.

Pentru acest tutorial, veți folosi mesaje fiabile. Când se primește un mesaj prin API, onMessageReceived va fi numit. Această metodă acceptă identificatorul punctului final, o sarcină utilă și un parametru boolean care indică dacă conexiunea este fiabilă sau nesigură. Sarcina utilă conține mesajul și identificatorul punctului final este identificatorul oricărui dispozitiv trimis mesajului.

În aplicația de probă, veți folosi aceasta pentru a afișa sarcina utilă ca un șir într-un ListView și dacă dispozitivul este gazda, retransmiteți-l la fiecare dispozitiv conectat.

@Override publice void onMessageReceived (String endpointId, octet [] încărcătură utilă, boolean isReliable) mMessageAdapter.add (new String (payload)); mMessageAdapter.notifyDataSetChanged (); dacă (mIsHost) sendMessage (nou String (sarcină utilă)); 

Trimite mesaj este o metodă de ajutor care demonstrează două versiuni de Nearby.Connections.sendReliableMessage. Pentru aplicațiile gazdă, sendReliableMessage va accepta o listă de puncte finale pentru trimiterea mesajului. Acest lucru vă permite să comunicați mai multor dispozitive cu o singură linie de cod. Pentru clienți, numai mesajele trebuie să se adreseze gazdei, deci este necesar doar numele gazdei ca parametru cu GoogleApiClient și matricea byte de mesaje.

private void sendMessage (mesajul String) if (mIsHost) Nearby.Connections.sendReliableMessage (mGoogleApiClient, mRemotePeerEndpoints, message.getBytes ()); mMessageAdapter.add (mesaj); mMessageAdapter.notifyDataSetChanged ();  altceva Nearby.Connections.sendReliableMessage (mGoogleApiClient, mRemoteHostEndpoint, (Nearby.Connections.getLocalDeviceId (mGoogleApiClient) + "spune:" + message) .getBytes ()); 

5. Deconectați

Când sunteți gata să vă deconectați de pe partea gazdă sau de client a aplicației, trebuie să faceți puțină curățare. Pentru gazde, trebuie să opriți publicitatea și să deconectați toate punctele finale.

În exemplul de cod, veți observa că este trimis și un mesaj care încearcă să permită colegilor să știe că gazda a deconectat. Într-o aplicație mai completă, doriți ca clienții dvs. să asculte acest tip de mesaj, astfel încât să se poată ocupa de situație în mod corespunzător.

Dacă încercați să vă deconectați de la un client care încă nu sa conectat la o gazdă, pur și simplu trebuie să întrerupeți descoperirea. Dacă v-ați conectat deja la o gazdă, sunați disconnectFromEndpoint iar API se va ocupa de separarea conexiunii.

private void deconect () if (! isConnectedToNetwork ()) retur; dacă (mIsHost) sendMessage ("Închiderea gazdei"); Nearby.Connections.stopAdvertising (mGoogleApiClient); În apropiere.Connections.stopAllEndpoints (mGoogleApiClient); mIsHost = false; mStatusText.setText ("Nu este conectat"); mRemotePeerEndpoints.clear ();  altceva if (! mIsConnected || TextUtils.isEmpty (mRemoteHostEndpoint)) În apropiere.Connections.stopDiscovery (mGoogleApiClient, getString (R.string.service_id)); întoarcere;  sendMessage ("Deconectarea"); În apropiere.Connections.disconnectFromEndpoint (mGoogleApiClient, mRemoteHostEndpoint); mRemoteHostEndpoint = null; mStatusText.setText ("Deconectat");  mIsConnected = false; 

Concluzie

În acest tutorial, ați învățat cum să implementați comunicarea între diferite dispozitive Android printr-o rețea locală folosind API-ul Connections Nearby. Acum ar trebui să vă puteți îmbunătăți propriile aplicații conectând împreună dispozitivele și păstrându-le în sincronizare prin diferite actualizări.

În timp ce acest tutorial te-a purtat într-o aplicație destul de simplă pentru clienți de chat, poți să iei ceea ce ai învățat aici pentru a crea experiențe multiplayer lustruite, pentru a le oferi utilizatorilor o secvență secundară sau pentru a-ți face contextual conștiința prin furnizarea unui canal de comunicare suplimentar pentru mediul înconjurător in jurul lor.

Pe măsură ce conexiunea API Near Connections continuă să crească odată cu adăugarea de balize Eddystone și Bluetooth, acest lucru se va dovedi a fi o abilitate neprețuită de a avea atunci când dezvoltați aplicații Android.

Cod