ارتباطات را مدیریت کنید

یک اتصال را آغاز کنید

هنگامی که دستگاه های نزدیک پیدا می شوند، کاشف می تواند اتصالات را آغاز کند. مثال زیر به محض کشف یک دستگاه درخواست اتصال با آن را می دهد.

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

بسته به مورد استفاده شما، ممکن است بخواهید در عوض لیستی از دستگاه های کشف شده را برای کاربر نمایش دهید و به آنها اجازه دهید انتخاب کنند که به کدام دستگاه ها متصل شوند.

یک اتصال را بپذیرید یا رد کنید

پس از اینکه کاشف درخواست اتصال به یک تبلیغ کننده را داد، هر دو طرف از طریق روش onConnectionInitiated() از ConnectionLifecycleCallback callback از فرآیند شروع اتصال مطلع می شوند. توجه داشته باشید که این callback به startAdvertising() در تبلیغ کننده و requestConnection( requestConnection() در کشف کننده ارسال می شود، اما از این نقطه به بعد، API متقارن است.

اکنون هر دو طرف باید انتخاب کنند که آیا اتصال را بپذیرند یا رد کنند، به ترتیب از طریق یک فراخوانی به acceptConnection() یا rejectConnection() . ارتباط تنها زمانی به طور کامل برقرار می شود که هر دو طرف پذیرفته باشند. اگر یکی یا هر دو رد کنند، اتصال کنار گذاشته می شود. در هر صورت، نتیجه به onConnectionResult() تحویل داده می شود.

قطعه کد زیر نحوه اجرای این فراخوان را نشان می دهد:

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

باز هم، این مثال نشان می دهد که اتصال به طور خودکار توسط هر دو طرف پذیرفته می شود، اما بسته به مورد استفاده شما ممکن است بخواهید این انتخاب را به نحوی به کاربر ارائه دهید.

یک اتصال را تأیید کنید

هنگامی که یک اتصال درخواست می شود، برنامه شما می تواند با استفاده از کد احراز هویت ارائه شده به onConnectionInitiated() ارتباط را احراز هویت کند. این روشی را فراهم می کند تا کاربران تأیید کنند که به دستگاه مورد نظر متصل هستند. به هر دو دستگاه یک نشانه داده می شود که یک رشته تصادفی کوتاه است. این به شما بستگی دارد که تصمیم بگیرید چگونه آن را تأیید کنید. معمولاً این شامل نشان دادن توکن در هر دو دستگاه و درخواست از کاربران برای مقایسه و تأیید دستی است، شبیه به گفتگوی جفت شدن بلوتوث.

این کد نمونه یکی از راه‌های احراز هویت را با نمایش کد احراز هویت به کاربر در 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();
}