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