Services Google Play Utilisation de l'API Connexions à proximité

introduction

L’une des nombreuses API disponibles dans les services Google Play est la API Connexions à proximité. Introduit début 2015, ce cadre vous permet de configurer un périphérique exécutant votre application en tant qu'hôte et de le connecter à plusieurs autres périphériques afin de pouvoir communiquer entre eux. Réseau local (LAN).

Les cas d'utilisation de cette fonctionnalité comprennent la connexion d'un téléphone à un téléviseur Android pour contrôler une application et permettre aux utilisateurs de participer à un jeu multijoueur. Dans ce didacticiel, vous apprendrez à configurer des applications pour connecter plusieurs périphériques ensemble sur un réseau et à envoyer des données via cette connexion. Vous trouverez un exemple de travail pour ce tutoriel sur GitHub..

1. Configuration du projet

Une fois votre programme initial créé dans Android Studio, vous devez importer la bibliothèque Play Services dans votre application. Pour ce faire, placez la ligne de code suivante sous le nœud de dépendance du build.gradle fichier. Au moment de la rédaction de ce document, Play Services 7.5.0 est la version la plus récente pour le développement..

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

Une fois que Play Services est inclus dans votre application, vous pouvez fermer build.gradle et ouvert AndroidManifest.xml. Puisque cette fonctionnalité utilise un réseau local pour communiquer, vous devrez inclure le ACCESS_NETWORK_STATE permission dans votre manifeste.

Ensuite, vous devrez ajouter un morceau de méta-données dans le application nœud qui définit un identifiant de service qui sera utilisé par votre application afin qu'elle puisse découvrir les hôtes publicitaires avec ce même identifiant. Dans cet exemple, notre identifiant de service est défini dans strings.xml comme tutsplus_service_id.

Lorsque vous avez terminé avec le manifeste, vous pouvez passer à MainActivity.java. C'est la classe où nous allons implémenter à la fois la publicité et la découverte. Dans Activité principale, vous contrôlerez également l'envoi de messages entre différents appareils.

Pour commencer à utiliser l'API Connexions à proximité, vous devez configurer et vous connecter au client API Google. Commencez par mettre en œuvre ConnectionCallbacks et OnConnectionFailedListener au sommet de votre classe. Pendant que nous ajoutons nos interfaces, incluons également les trois requis par l’API et un OnClickListener.

Classe publique MainActivity étend AppCompatActivity implémente GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, Connections.ConnectionRequestListener, Connections.MessageListener, Connections.EndpointDiscoveryListener, View.OnClickListener. 

Créons maintenant les variables de membre dont nous aurons besoin pour ce tutoriel en haut de la Activité principale classe. Par souci de brièveté, je mentionnerai simplement que la mise en page de cette classe consiste en un ListView pour afficher des messages, un Éditer le texte champ avec un Bouton pour l'envoi de messages après connexion, un Bouton pour la publicité, la connexion ou la déconnexion, en fonction du rôle de l'appareil, et une Affichage pour afficher des informations d'état de base.

Vous remarquerez qu'il y a deux drapeaux booléens pour indiquer si le périphérique est connecté et si c'est l'hôte de connexion, le GoogleApiClient cela est nécessaire pour utiliser l'API Near Connections et un tableau d'entiers pour garder une trace des types de connexion réseau que nous prendrons en charge pour cette API.

private GoogleApiClient mGoogleApiClient; Spinner privé mTypeSpinner; TextView privé mStatusText; bouton privé mConnectionButton; bouton privé mSendButton; liste privée mListView; ViewGroup privé mSendTextContainer; private EditText mSendEditText; ArrayAdapter privé mMessageAdapter; boIlean privé mIsHost; privé booléen mIsConnected; private String mRemoteHostEndpoint; liste privée mRemotePeerEndpoints = new ArrayList(); privé statique final long CONNECTION_TIME_OUT = 10000L; private static int [] NETWORK_TYPES = ConnectivityManager.TYPE_WIFI, ConnectivityManager.TYPE_ETHERNET;

Si vous avez déjà utilisé des classes d'API Android Google Google auparavant, la dernière partie de la configuration devrait vous paraître assez familière. Vous devez initialiser le GoogleApiClient et se connecter à onCreate.

mGoogleApiClient = new GoogleApiClient.Builder (this) .addConnectionCallbacks (this) .addOnConnectionFailedListener (this) .addApi (Nearby.CONNECTIONS_API) .build ();

Dans onStart et onStop, nous gérons la connexion et la déconnexion.

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

2. Publicité et acceptation de liens

Une fois que vous vous êtes connecté au client API Google, vous pouvez commencer à utiliser les connexions à proximité. Le premier composant que nous allons examiner est La publicité, qui permet à un périphérique d’assumer le rôle d’hôte et de gérer les connexions entre différents homologues pour la communication.

La publicité elle-même est assez simple. Vous devez simplement vérifier que le périphérique dispose d'un type de connexion acceptable, puis appeler Nearby.Connections.StartAdvertising avec les paramètres appropriés. Cela entraînera le périphérique à annoncer sur votre réseau local qu'il est disponible pour accepter les connexions d'autres applications..

Dans cet exemple, nous passons un délai d'attente de dix secondes pour la publicité. Cependant, vous pouvez passer une valeur de 0 faire de la publicité indéfiniment. Dans le code suivant, isConnectedToNetwork est une méthode d'assistance destinée à vérifier si de la publicité doit apparaître.

private void advertise () if (! isConnectedToNetwork ()) return; String name = "Publicité à proximité"; Nearby.Connections.startAdvertising (mGoogleApiClient, nom, null, CONNECTION_TIME_OUT, this) .setResultCallback (nouveau ResultCallback() @Override public void onResult (Connections.StartAdvertisingResult result) if (result.getStatus (). IsSuccess ()) mStatusText.setText ("Advertising"); );  private boolean isConnectedToNetwork () ConnectivityManager connManager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); for (int networkType: NETWORK_TYPES) ​​Info réseau Info = connManager.getNetworkInfo (type de réseau); if (info! = null && info.isConnectedOrConnecting ()) return true;  return false; 

Une fois que votre application hôte fait de la publicité, elle pourra recevoir les demandes de connexion de ses pairs. Lorsqu'un périphérique tente de se connecter, la méthode suivante est appelée:

onConnectionRequest public final (String final remoteEndpointId, final String remoteDeviceId, final String remoteEndpointName, byte [] charge utile)

En utilisant cette méthode, vous pouvez accepter ou refuser la connexion. Pour accepter la demande, vous appelez Nearby.Connections.acceptConnectionRequest avec un RésultatsCallback. Vous pouvez ensuite effectuer des actions, selon que la connexion est acceptée ou non..

Pour cet exemple, nous allons simplement ajouter le point de terminaison distant à une liste pour en assurer le suivi et le diffuser à tous les homologues connectés auxquels ce nouveau périphérique a été connecté. Si, pour une raison quelconque, vous déterminez que le périphérique ne doit pas se connecter à votre application, vous pouvez le refuser en appelant Nearby.Connections.rejectConnectionRequest.

@Override public void onConnectionRequest (final String remoteEndpointId, final String remoteDeviceId, final String remoteEndpointName, byte [] payload) if (mIsHost) Nearby.Connections.acceptConnectionRequest (mGoogleApiClient, remoteEndpointId, payload).() @Override public void onResult (Status status) if (status.isSuccess ()) if (! 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. découverte

Tout comme la publicité, la découverte repose sur la connexion au réseau. GoogleApiClient et ayant une connexion réseau acceptable. Vous pouvez lancer la découverte en transmettant l'identifiant de service de l'application au Nearby.Connections.startDiscovery méthode, qui met le périphérique de votre utilisateur en mode découverte.

Lorsque le périphérique détecte un hôte faisant actuellement de la publicité à l'aide de l'identificateur de service prédéfini, le onEndpointFound le rappel sera déclenché. Il convient de noter que cette méthode peut être appelée plusieurs fois s'il y a plusieurs hôtes en diffusion. Dans cette situation, vous pouvez créer une boîte de dialogue pour vos utilisateurs, qui affiche tous les hôtes disponibles afin de leur permettre de sélectionner les objets auxquels ils souhaitent être connectés..

Pour cet exemple, supposons qu’il n’ya qu’un seul hôte à la fois, nous demanderons immédiatement à vous connecter en appelant Nearby.Connections.sendConnectionRequest. Si la connexion est acceptée ou rejetée par l'hôte, le sendConnectionRequest le rappel de résultat sera appelé. Si la connexion est acceptée, l'état est défini sur Succès. Nous pouvons enregistrer l'identificateur du noeud final de l'hôte et préparer l'envoi des messages via le canal de connexion..

private void discover () if (! isConnectedToNetwork ()) return; String serviceId = getString (R.string.service_id); Nearby.Connections.startDiscovery (mGoogleApiClient, serviceId, 10000L, this) .setResultCallback (nouveau ResultCallback() @Override public void onResult (Status status) if (status.isSuccess ()) mStatusText.setText ("Discovering");  else Log.e ("TutsPlus", "La détection a échoué:" + status.getStatusMessage ()); );  @Override public void onEndpointFound (String endpointId, String deviceId, final String serviceId, String endpointName) byte [] payload = null; Nearby.Connections.sendConnectionRequest (mGoogleApiClient, deviceId, endpointId, charge utile, nouveau Connections.ConnectionResponseCallback () @Override public void onConnectionResponse (String endpointId, Status Status, byte [] bytes) if (status.isSuccess). setText ("Connecté à:" + endpointId); Nearby.Connections.stopDiscovery (mGoogleApiClient, serviceId); mRemoteHostEndpoint = endpointId; mSendTextContainer.setVisibility (View.VISIBLE); si (! mIsH .setText ("Connexion à" + endpointId + "échoué"); if (! mIsHost) mIsConnected = false;, this); 

Dans le cas où vous écoutez plusieurs terminaux pour présenter un choix à vos utilisateurs, le onEndpointLost Cette méthode vous permettra de savoir si un hôte a cessé de diffuser de la publicité avant que votre utilisateur ait tenté de s'y connecter. le onDisconnected Le rappel est également disponible pour les périphériques clients et peut être utilisé pour se reconnecter à des hôtes publicitaires en cas de déconnexion imprévue..

4. Envoi de messages

Une fois vos appareils connectés, il est temps de commencer à communiquer. Il existe deux types de messages qui peuvent être envoyés, fiable et non fiable. Si vous êtes familier avec la technologie de réseau, vous pouvez l’envisager en termes de TCP (Protocole de contrôle de transmission) et UDP (Protocole de datagramme utilisateur). Une explication simplifiée est que les messages fiables réessayeront d’essayer d’envoyer un message s’ils échouent, alors que les messages non fiables abandonnent simplement les données si elles ne sont pas envoyées et reçues avec succès..

Pour ce tutoriel, vous utiliserez des messages fiables. Lorsqu'un message est reçu via l'API, onMessageReceived sera appelé. Cette méthode accepte l'identificateur de point final, une charge utile et un booléen indiquant si la connexion est fiable ou non fiable. La charge utile contient le message et l'identificateur de noeud final est l'identifiant du périphérique ayant envoyé le message..

Dans l’exemple d’application, vous allez utiliser ceci pour afficher la charge utile sous forme de chaîne dans un fichier. ListView et, si le périphérique est l'hôte, retransmettez-le à chaque périphérique connecté.

@Override public void onMessageReceived (String endpointId, byte [] charge utile, boolean isReliable) mMessageAdapter.add (new String (charge))); mMessageAdapter.notifyDataSetChanged (); if (mIsHost) sendMessage (new String (charge utile)); 

le envoyer le message méthode est une méthode d'assistance qui montre deux versions de Nearby.Connections.sendReliableMessage. Pour les applications hôtes, sendReliableMessage acceptera une liste de points de terminaison auxquels envoyer le message. Cela vous permet de communiquer avec plusieurs appareils avec une seule ligne de code. Pour les clients, les messages doivent uniquement aller à l'hôte, de sorte que seul le nom d'hôte est requis en tant que paramètre avec le paramètre GoogleApiClient et message tableau d'octets.

void privé sendMessage (message de chaîne) if (mIsHost) Nearby.Connections.sendReliableMessage (mGoogleApiClient, mRemotePeerEndpoints, message.getBytes ()); mMessageAdapter.add (message); mMessageAdapter.notifyDataSetChanged ();  else Nearby.Connections.sendReliableMessage (mGoogleApiClient, mRemoteHostEndpoint, (Nearby.Connections.getLocalDeviceId (mGoogleApiClient) + dit: "+ message) .getBytes ()); 

5. Déconnexion

Lorsque vous êtes prêt à vous déconnecter du côté hôte ou côté client de l'application, vous devez effectuer un peu de nettoyage. Pour les hôtes, vous devez arrêter la publicité et déconnecter tous vos points finaux..

Dans l'exemple de code, vous remarquerez qu'un message est également envoyé pour tenter d'informer les pairs que l'hôte s'est déconnecté. Dans une application plus complète, vous souhaitez que vos clients écoutent ce type de message afin de pouvoir gérer la situation de manière appropriée..

Si vous essayez de vous déconnecter sur un client qui ne s'est pas encore connecté à un hôte, vous devez simplement arrêter la découverte. Si vous êtes déjà connecté à un hôte, vous appelez disconnectFromEndpoint et l'API va gérer la rupture de la connexion.

private void disconnect () if (! isConnectedToNetwork ()) return; if (mIsHost) sendMessage ("Arrêt de l'hôte"); Nearby.Connections.stopAdvertising (mGoogleApiClient); Nearby.Connections.stopAllEndpoints (mGoogleApiClient); mIsHost = false; mStatusText.setText ("Non connecté"); mRemotePeerEndpoints.clear ();  else if (! mIsConnected || TextUtils.isEmpty (mRemoteHostEndpoint)) Nearby.Connections.stopDiscovery (mGoogleApiClient, getString (R.string.service_id)); revenir;  sendMessage ("Déconnexion"); Nearby.Connections.disconnectFromEndpoint (mGoogleApiClient, mRemoteHostEndpoint); mRemoteHostEndpoint = null; mStatusText.setText ("Disconnected");  mIsConnected = false; 

Conclusion

Dans ce didacticiel, vous avez appris à implémenter la communication entre divers périphériques Android sur un réseau local à l'aide de l'API Connexions à proximité. Vous devriez maintenant pouvoir améliorer vos propres applications en connectant des appareils ensemble et en les synchronisant via diverses mises à jour..

Pendant que ce didacticiel vous a présenté une application client de chat assez simple, vous pouvez utiliser ce que vous avez appris ici pour créer des expériences multijoueurs raffinées, fournir des écrans secondaires aux utilisateurs ou rendre vos applications plus sensibles au contexte en fournissant un canal de communication supplémentaire pour l'environnement. autour d'eux.

Alors que l'API Near Connections continue de se développer avec l'ajout des balises Eddystone et de Bluetooth, cela s'avérera être une compétence inestimable lors du développement d'applications Android..