התחלת חיבור
כשנמצאים מכשירים בקרבת מקום, המגלה יכול ליזום חיבורים. בדוגמה הבאה אנחנו מבקשים חיבור למכשיר ברגע שמתגלה אותו.
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. } };
בהתאם לתרחיש לדוגמה שלכם, ייתכן שתרצו להציג במקום זאת רשימה של למכשירים של המשתמש, וכך הוא יכול לבחור לאילו מכשירים להתחבר.
אישור או דחייה של חיבור
אחרי שהחושף ביקש ליצור קשר עם מפרסם, שני הצדדים
נשלחה הודעה על תהליך התחלת החיבור דרך onConnectionInitiated()
ה-method של
ConnectionLifecycleCallback
קריאה חוזרת. לתשומת ליבך, הקריאה החוזרת (callback) הזו מועברת אל startAdvertising()
המפרסם וrequestConnection()
על ידי הגילוי, אבל מנקודה זו
קדימה, ה-API הוא סימטרי.
עכשיו שני הצדדים צריכים לבחור אם לאשר או לדחות את החיבור באמצעות שיחה.
ל-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. } };
שוב, בדוגמה הזו אפשר לראות שהחיבור מתקבל אוטומטית על ידי שני הצדדים, אבל בהתאם לתרחיש לדוגמה שלכם, ייתכן שתרצו להציג את הבחירה הזו למשתמש בצורה כלשהי.
אימות החיבור
כשנשלחת בקשה לחיבור, האפליקציה יכולה לאמת את החיבור באמצעות
באמצעות אסימון האימות שסופק ל-onConnectionInitiated()
. הזה
מספקת דרך לאפשר למשתמשים לאשר שהם מתחברים אל
במכשיר. שני המכשירים מקבלים את אותו אסימון, שהוא מחרוזת אקראית קצרה.
אתה מחליט איך לאמת את הפרטים. בדרך כלל התהליך הזה כולל הצגת
בשני המכשירים ולבקש מהמשתמשים להשוות ולאשר אותם באופן ידני,
בדומה לתיבת דו-שיח של התאמת Bluetooth.
הקוד לדוגמה מדגים אחת הדרכים לביצוע אימות על ידי הצגת
אסימון אימות למשתמש ב-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(); }