إدارة الاتصالات

بدء عملية ربط

عند العثور على أجهزة قريبة، يمكن للمكتشف بدء الاتصالات. تشير رسالة الأشكال البيانية في المثال التالي يطلب الاتصال بالجهاز بمجرد اكتشافه.

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() طريقة ConnectionLifecycleCallback معاودة الاتصال. تجدر الإشارة إلى أنّه يتم تمرير معاودة الاتصال هذه إلى startAdvertising() في المعلن وrequestConnection() على الباحث، ولكن من الآن فصاعدًا قدمًا، تكون واجهة برمجة التطبيقات متماثلة.

الآن يجب على كلا الجانبين اختيار قبول الاتصال أو رفضه عبر مكالمة إلى acceptConnection() أو rejectConnection()، على التوالي. الاتصال ثابتًا بالكامل فقط عند قبول الجانبين. إذا تم رفض أحدهما أو كليهما، فسيتم تم إلغاء عملية الربط. في كلتا الحالتين، يتم تسليم النتيجة إلى onConnectionResult()

يعرض مقتطف الرمز التالي طريقة تنفيذ معاودة الاتصال هذه:

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(). هذا النمط توفّر طريقة تسمح للمستخدمين بالتأكّد من أنّهم متصلون بالجهاز الخاص بك. يتم منح كلا الجهازين الرمز المميّز نفسه، وهو سلسلة عشوائية قصيرة. فإن الأمر متروك لك لتحديد كيفية التحقق منه. وعادةً ما يتضمن ذلك عرض على كلا الجهازين ويطلب من المستخدمين المقارنة والتأكيد يدويًا يشبه مربع حوار إقران البلوتوث.

يوضح نموذج الرمز هذا طريقة واحدة للمصادقة من خلال عرض رمز المصادقة المميز للمستخدم في 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();
}