เริ่มการเชื่อมต่อ
เมื่อพบอุปกรณ์ที่อยู่ใกล้เคียง ผู้ค้นพบจะเริ่มการเชื่อมต่อได้ ตัวอย่างต่อไปนี้จะขอเชื่อมต่อกับอุปกรณ์ทันทีที่ค้นพบ
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. } };
คุณอาจต้องแสดงรายการที่ค้นพบแทน ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานของคุณ อุปกรณ์ให้แก่ผู้ใช้ ทำให้สามารถเลือกอุปกรณ์ที่จะเชื่อมต่อได้
ยอมรับหรือปฏิเสธการเชื่อมต่อ
หลังจากที่ผู้ค้นพบได้ขอติดต่อกับผู้ลงโฆษณาแล้ว ทั้ง 2 ฝ่าย
ได้รับแจ้งเกี่ยวกับขั้นตอนการเริ่มต้นการเชื่อมต่อผ่าน onConnectionInitiated()
ของวิธีการ
ConnectionLifecycleCallback
Callback โปรดทราบว่าระบบจะส่ง Callback นี้ไปยัง startAdvertising()
ใน
และ requestConnection()
ในการค้นพบ แต่จากจุดนี้
ไปข้างหน้า API มีลักษณะสมมาตร
ตอนนี้ทั้ง 2 ฝ่ายต้องเลือกว่าจะยอมรับหรือปฏิเสธการเชื่อมต่อผ่านการโทร
เป็น acceptConnection()
หรือ rejectConnection()
ตามลำดับ การเชื่อมต่อคือ
อย่างสมบูรณ์ได้ก็ต่อเมื่อทั้งสองฝ่ายยอมรับแล้วเท่านั้น หากข้อใดข้อหนึ่งหรือทั้งสองปฏิเสธ
ยกเลิกการเชื่อมต่อแล้ว ไม่ว่าคุณจะเลือกวิธีใด ผลลัพธ์จะส่งไปที่
onConnectionResult()
ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีใช้ Callback นี้
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. } };
ตัวอย่างนี้แสดงการเชื่อมต่อที่ได้รับการยอมรับโดยอัตโนมัติจากทั้ง 2 ฝั่ง แต่คุณอาจต้องเสนอตัวเลือกนี้ให้กับผู้ใช้ในแบบใดแบบหนึ่ง ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานของคุณ
ตรวจสอบสิทธิ์การเชื่อมต่อ
เมื่อมีการขอการเชื่อมต่อ แอปของคุณสามารถตรวจสอบสิทธิ์การเชื่อมต่อได้โดย
โดยใช้โทเค็นการตรวจสอบสิทธิ์ที่ระบุให้กับ onConnectionInitiated()
ช่วงเวลานี้
ช่วยให้ผู้ใช้ยืนยันได้ว่า ตนกำลังเชื่อมต่อกับ
อุปกรณ์ อุปกรณ์ทั้ง 2 เครื่องจะได้รับโทเค็นเดียวกันซึ่งเป็นสตริงแบบสุ่มสั้นๆ
คุณเป็นผู้ตัดสินใจว่าจะยืนยันอย่างไร ซึ่งโดยทั่วไปแล้วจะประกอบด้วย
โทเค็นบนอุปกรณ์ทั้ง 2 เครื่องและขอให้ผู้ใช้เปรียบเทียบและยืนยัน
ที่คล้ายกับกล่องโต้ตอบการจับคู่บลูทูธ
โค้ดตัวอย่างนี้แสดงวิธีหนึ่งในการตรวจสอบสิทธิ์โดยการแสดง
โทเค็นการตรวจสอบสิทธิ์สำหรับผู้ใช้ใน 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(); }