Quản lý các kết nối

Bắt đầu kết nối

Khi tìm thấy thiết bị ở gần, người khám phá có thể bắt đầu kết nối. Ví dụ sau đây yêu cầu kết nối với thiết bị ngay khi phát hiện thiết bị.

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

Tuỳ thuộc vào trường hợp sử dụng, bạn có thể hiển thị cho người dùng một danh sách thiết bị đã được phát hiện để cho phép họ chọn thiết bị sẽ kết nối.

Chấp nhận hoặc từ chối kết nối

Sau khi người khám phá yêu cầu kết nối với một nhà quảng cáo, cả hai bên sẽ được thông báo về quy trình bắt đầu kết nối thông qua phương thức onConnectionInitiated() của lệnh gọi lại ConnectionLifecycleCallback. Lưu ý là lệnh gọi lại này được chuyển vào startAdvertising() trên nhà quảng cáo và requestConnection() trên trình khám phá, nhưng từ thời điểm này trở đi, API sẽ đối xứng.

Bây giờ, cả hai bên đều phải chọn chấp nhận hoặc từ chối kết nối thông qua lệnh gọi đến acceptConnection() hoặc rejectConnection() tương ứng. Kết nối chỉ được thiết lập hoàn chỉnh khi cả hai bên đã chấp nhận. Nếu một hoặc cả hai từ chối, kết nối sẽ bị hủy. Dù bằng cách nào, kết quả cũng sẽ được gửi đến onConnectionResult().

Đoạn mã sau đây cho thấy cách triển khai lệnh gọi lại này:

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

Xin nhắc lại rằng ví dụ này thể hiện việc kết nối được cả hai bên tự động chấp nhận, nhưng tùy thuộc vào trường hợp sử dụng, bạn có thể hiển thị lựa chọn này cho người dùng theo một cách nào đó.

Xác thực kết nối

Khi có yêu cầu kết nối, ứng dụng của bạn có thể xác thực kết nối bằng cách sử dụng mã xác thực được cung cấp cho onConnectionInitiated(). Điều này cung cấp một cách để cho phép người dùng xác nhận rằng họ đang kết nối với thiết bị dự định. Cả hai thiết bị đều được cung cấp cùng một mã thông báo. Đây là một chuỗi ngẫu nhiên ngắn; bạn có toàn quyền quyết định cách xác minh mã này. Thông thường, điều này bao gồm việc hiển thị mã thông báo trên cả hai thiết bị và yêu cầu người dùng so sánh và xác nhận theo cách thủ công, tương tự như hộp thoại ghép nối Bluetooth.

Mã mẫu này minh hoạ một cách để xác thực bằng cách hiển thị mã thông báo xác thực cho người dùng trong 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();
}