Kelola koneksi

Memulai koneksi

Saat perangkat di sekitar ditemukan, pencari dapat memulai koneksi. Contoh berikut ini meminta koneksi dengan perangkat segera setelah ditemukan.

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

Bergantung pada kasus penggunaan Anda, sebaiknya tampilkan daftar perangkat yang ditemukan kepada pengguna, sehingga mereka dapat memilih perangkat yang terhubung.

Menyetujui atau menolak koneksi

Setelah penemu meminta koneksi ke pengiklan, kedua sisi akan diberi tahu proses memulai koneksi melalui metode onConnectionInitiated() dari callback ConnectionLifecycleCallback. Perhatikan bahwa callback ini diteruskan ke startAdvertising() pada pengiklan dan requestConnection() pada Discoverer, tetapi mulai saat ini, API tersebut bersifat simetris.

Sekarang kedua belah pihak harus memilih apakah akan menerima atau menolak koneksi melalui panggilan ke acceptConnection() atau rejectConnection(). Koneksi sepenuhnya terbentuk hanya jika kedua belah pihak telah menyetujui. Jika salah satu atau keduanya menolak, koneksi akan dihapus. Apa pun pilihannya, hasilnya akan dikirimkan ke onConnectionResult().

Cuplikan kode berikut menunjukkan cara menerapkan callback ini:

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

Sekali lagi, contoh ini menunjukkan koneksi yang diterima secara otomatis oleh kedua belah pihak, tetapi bergantung pada kasus penggunaan Anda, mungkin Anda ingin menyajikan pilihan ini kepada pengguna dengan cara tertentu.

Mengautentikasi koneksi

Saat koneksi diminta, aplikasi Anda dapat mengautentikasi koneksi menggunakan token token yang diberikan ke onConnectionInitiated(). Hal ini menyediakan cara untuk memungkinkan pengguna mengonfirmasi bahwa mereka terhubung ke perangkat yang dimaksud. Kedua perangkat diberi token yang sama, yang merupakan string acak pendek; Anda bebas menentukan cara memverifikasinya. Biasanya, hal ini melibatkan token ditampilkan di kedua perangkat dan meminta pengguna untuk membandingkan dan mengonfirmasi secara manual, yang mirip dengan dialog penyambungan bluetooth.

Kode contoh ini menunjukkan satu cara autentikasi dengan menampilkan token autentikasi kepada pengguna dalam 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();
}