จัดการการเชื่อมต่อ

เริ่มการเชื่อมต่อ

เมื่อพบอุปกรณ์ที่อยู่ใกล้เคียง ผู้ค้นพบจะเริ่มการเชื่อมต่อได้ ตัวอย่างต่อไปนี้จะขอเชื่อมต่อกับอุปกรณ์ทันทีที่ค้นพบ

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