Avvia una connessione
Quando vengono trovati dispositivi nelle vicinanze, il rilevatore può avviare connessioni. La nell'esempio seguente viene richiesta una connessione con un dispositivo non appena viene rilevato.
private final EndpointDiscoveryCallback endpointDiscoveryCallback = new EndpointDiscoveryCallback() { @Override public void onEndpointFound(String endpointId, DiscoveredEndpointInfo info) { // An endpoint was found. We request a connection to it. Nearby.getConnectionsClient(context) .requestConnection(getLocalUserName(), endpointId, connectionLifecycleCallback) .addOnSuccessListener( (Void unused) -> { // We successfully requested a connection. Now both sides // must accept before the connection is established. }) .addOnFailureListener( (Exception e) -> { // Nearby Connections failed to request the connection. }); } @Override public void onEndpointLost(String endpointId) { // A previously discovered endpoint has gone away. } };
A seconda del tuo caso d'uso, potresti voler mostrare invece un elenco dispositivi per l'utente, consentendogli di scegliere a quali dispositivi connettersi.
Accettare o rifiutare una connessione
Dopo che lo strumento di rilevamento ha richiesto una connessione con un inserzionista, entrambe le parti vengono
notificato il processo di avvio della connessione tramite onConnectionInitiated()
del metodo
ConnectionLifecycleCallback
di Google. Tieni presente che questo callback viene passato a startAdvertising()
su
inserzionista e requestConnection()
sullo strumento di rilevamento, ma da questo punto
l'API è simmetrica.
Ora entrambe le parti devono scegliere se accettare o rifiutare la connessione tramite una chiamata
rispettivamente a acceptConnection()
o rejectConnection()
. La connessione è
completamente stabilite solo quando entrambe le parti
hanno accettato l'accordo. Se una o entrambe le opzioni rifiutano,
viene ignorata. In ogni caso, il risultato viene inviato
onConnectionResult()
.
Il seguente snippet di codice mostra come implementare questo callback:
private final ConnectionLifecycleCallback connectionLifecycleCallback = new ConnectionLifecycleCallback() { @Override public void onConnectionInitiated(String endpointId, ConnectionInfo connectionInfo) { // Automatically accept the connection on both sides. Nearby.getConnectionsClient(context).acceptConnection(endpointId, payloadCallback); } @Override public void onConnectionResult(String endpointId, ConnectionResolution result) { switch (result.getStatus().getStatusCode()) { case ConnectionsStatusCodes.STATUS_OK: // We're connected! Can now start sending and receiving data. break; case ConnectionsStatusCodes.STATUS_CONNECTION_REJECTED: // The connection was rejected by one or both sides. break; case ConnectionsStatusCodes.STATUS_ERROR: // The connection broke before it was able to be accepted. break; default: // Unknown status code } } @Override public void onDisconnected(String endpointId) { // We've been disconnected from this endpoint. No more data can be // sent or received. } };
Anche in questo caso, questo esempio mostra che la connessione viene accettata automaticamente da entrambe le parti, ma a seconda del caso d'uso potresti voler presentare questa scelta all'utente in qualche modo.
Autenticare una connessione
Quando viene richiesta una connessione, l'app può autenticarla tramite
utilizzando il token di autenticazione fornito a onConnectionInitiated()
. Questo
consente agli utenti di confermare che si connettono all'app
dispositivo. A entrambi i dispositivi viene assegnato lo stesso token, che è una breve stringa casuale.
spetta a te decidere come verificarlo. In genere ciò comporta la visualizzazione
su entrambi i dispositivi e chiedere agli utenti di confrontare e confermare manualmente.
in modo simile a una finestra di dialogo per l'accoppiamento Bluetooth.
Questo codice di esempio illustra un modo per eseguire l'autenticazione visualizzando
di autenticazione per l'utente in un AlertDialog
:
@Override public void onConnectionInitiated(String endpointId, ConnectionInfo info) { new AlertDialog.Builder(context) .setTitle("Accept connection to " + info.getEndpointName()) .setMessage("Confirm the code matches on both devices: " + info.getAuthenticationDigits()) .setPositiveButton( "Accept", (DialogInterface dialog, int which) -> // The user confirmed, so we can accept the connection. Nearby.getConnectionsClient(context) .acceptConnection(endpointId, payloadCallback)) .setNegativeButton( android.R.string.cancel, (DialogInterface dialog, int which) -> // The user canceled, so we should reject the connection. Nearby.getConnectionsClient(context).rejectConnection(endpointId)) .setIcon(android.R.drawable.ic_dialog_alert) .show(); }