Verbindungen verwalten

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();
}