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