Verbindung herstellen
Wenn Geräte in der Nähe gefunden werden, kann der Finder Verbindungen herstellen. Die Im folgenden Beispiel wird eine Verbindung mit einem Gerät angefordert, sobald es erkannt wird.
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. } };
Je nach Anwendungsfall können Sie stattdessen auch eine Liste der erkannten Geräte an den Nutzer, sodass er auswählen kann, zu welchen Geräten eine Verbindung hergestellt werden soll.
Verbindung akzeptieren oder ablehnen
Nachdem der Entdecker eine Verbindung zu einem Werbetreibenden angefordert hat, werden beide Seiten
über onConnectionInitiated()
über den Verbindungsinitiierungsprozess informiert
der Methode
ConnectionLifecycleCallback
Callback des Nutzers an. Dieser Callback wird an startAdvertising()
im
Werbetreibender und requestConnection()
für den Discoverer, aber ab diesem Punkt
ist die API symmetrisch.
Jetzt müssen beide Seiten entscheiden, ob die Verbindung über einen Anruf angenommen oder abgelehnt werden soll
acceptConnection()
bzw. rejectConnection()
. Die Verbindung ist
aber erst dann vollständig bestehen,
wenn beide Seiten akzeptiert haben. Wird von einer oder beiden abgelehnt,
Verbindung verworfen. In beiden Fällen wird das Ergebnis
onConnectionResult()
Das folgende Code-Snippet zeigt, wie dieser Callback implementiert wird:
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. } };
Auch dieses Beispiel zeigt, dass die Verbindung automatisch von beiden Seiten akzeptiert wird. Je nach Anwendungsfall können Sie diese Auswahlmöglichkeit dem Nutzer jedoch auf irgendeine Weise präsentieren.
Verbindung authentifizieren
Wenn eine Verbindung angefordert wird, kann Ihre App die Verbindung durch folgende Schritte authentifizieren:
unter Verwendung des onConnectionInitiated()
bereitgestellten Authentifizierungstokens. Dieses
können Nutzende bestätigen, dass sie eine Verbindung
. Beide Geräte erhalten dasselbe Token, bei dem es sich um einen kurzen zufälligen String handelt.
können Sie selbst entscheiden,
wie Sie sie bestätigen. In der Regel wird dabei
auf beiden Geräten erhalten
und die Nutzer bitten, sie manuell zu vergleichen,
ähnlich wie bei der Bluetooth-Kopplung.
Dieser Beispielcode zeigt eine Authentifizierungsmethode, indem der
Authentifizierungstoken für den Nutzer in einem 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(); }