Bağlantıları yönet

Bağlantı başlatma

Yakındaki cihazlar bulunduğunda, keşif aracı bağlantıları başlatabilir. Aşağıdaki örnek, cihaz bulunur bulunmaz cihazla bağlantı kurulmasını ister.

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.
      }
    };

Kullanım alanınıza bağlı olarak bunun yerine kullanıcıya, tespit edilen cihazların listesini göstererek, hangi cihazlara bağlanacaklarını seçmelerini isteyebilirsiniz.

Bağlantıyı kabul etme veya reddetme

Keşfeden, bir reklamverenle bağlantı isteğinde bulunduktan sonra her iki taraf da ConnectionLifecycleCallback geri çağırmasının onConnectionInitiated() yöntemi aracılığıyla bağlantı başlatma işlemi konusunda bilgilendirilir. Bu geri çağırma, reklamverende startAdvertising() öğesine ve keşifte requestConnection() öğesine iletilir, ancak bu andan itibaren API simetriktir.

Şimdi her iki taraf da bağlantıyı acceptConnection() veya rejectConnection() çağrısıyla kabul etmeyi veya reddetmeyi seçmelidir. Bağlantı yalnızca her iki taraf da kabul ettiğinde tamamen kurulur. Bunlardan biri veya her ikisi de reddedilirse bağlantı silinir. Her iki durumda da sonuç onConnectionResult() konumuna gönderilir.

Aşağıdaki kod snippet'i bu geri çağırmayı nasıl uygulayacağınızı göstermektedir:

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.
      }
    };

Bu örnekte de her iki taraf da bağlantıyı otomatik olarak kabul etmektedir. Kullanım alanınıza bağlı olarak bu seçeneği kullanıcıya bir şekilde sunabilirsiniz.

Bağlantının kimliğini doğrulama

Bir bağlantı istendiğinde, uygulamanız onConnectionInitiated() hizmetine sağlanan kimlik doğrulama jetonunu kullanarak bağlantının kimliğini doğrulayabilir. Bu, kullanıcıların istenen cihaza bağlandıklarını onaylamaları için bir yol sağlar. Her iki cihaza da aynı jeton verilir. Bu jeton, kısa bir rastgele dizedir. Nasıl doğrulanacağına siz karar verirsiniz. Genellikle bu, her iki cihazda da jetonun gösterilmesi ve kullanıcılardan, Bluetooth eşleme iletişim kutusuna benzer şekilde manuel olarak karşılaştırma yapıp onaylamalarını istemek anlamına gelir.

Bu örnek kod, bir AlertDialog içindeki kullanıcıya kimlik doğrulama jetonunu görüntüleyerek kimlik doğrulamanın bir yolunu gösterir:

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