Quản lý đường 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. Chiến lược phát hành đĩa đơn ví dụ sau đây yêu cầu kết nối với một thiết bị ngay khi phát hiện thấy 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 nên hiển thị danh sách thiết bị nào cho người dùng, cho phép họ chọn thiết bị cần 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 đều được thông báo về quy trình bắt đầu kết nối qua onConnectionInitiated() của ConnectionLifecycleCallback . Lưu ý rằng 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 người khám phá, nhưng từ thời điểm này chuyển tiếp, API sẽ đối xứng.

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

Đoạn mã sau đây minh hoạ 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, ví dụ này cho thấy kết nối được cả hai bên tự động chấp nhận, nhưng tuỳ thuộc vào trường hợp sử dụng của mình, bạn có thể muốn cho người dùng thấy lựa chọn này 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 bằng mã xác thực được cung cấp cho onConnectionInitiated(). Chiến dịch 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ị. Cả hai thiết bị đều được cấp cùng một mã thông báo (là một chuỗi ngắn ngẫu nhiên); việc xác minh cách xác minh hay không là tuỳ thuộc vào bạn. Thông thường, việc này bao gồm việc hiển thị trên cả hai thiết bị rồi 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ã 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();
}