واجهة برمجة تطبيقات اكتشاف الأجهزة

تبدأ كل تجربة لأجهزة متعددة تقريبًا بالعثور على الأجهزة المتاحة. لتبسيط هذه المهمة الشائعة، نقدّم Device Discovery API.

مربّع حوار يتضمّن خيارات المشاركة للمستخدمين القريبين
الشكل 1: المشاركة مع المستخدمين القريبين.

فتح مربع حوار اختيار الجهاز

تستخدم ميزة "اكتشاف الجهاز" مربّع حوار نظام للسماح للمستخدم باختيار الجهاز المستهدَف. لبدء مربع حوار اختيار الجهاز، تحتاج أولاً إلى الحصول على عميل اكتشاف الجهاز وتسجيل مستلم النتائج. يُرجى العِلم أنّه على غرار registerForActivityResult، يجب تسجيل جهاز الاستقبال هذا بدون شرط كجزء من مسار النشاط أو إعداد التقسيم.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  devicePickerLauncher = Discovery.create(this).registerForResult(this, handleDevices)
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  devicePickerLauncher = Discovery.create(this).registerForResult(this, handleDevices);
}

في مقتطف الرمز أعلاه، لدينا كائن handleDevices غير محدّد. بعد أن يختار المستخدم الأجهزة التي تريد الاتصال بها، وبعد أن يتم ربط حزمة تطوير البرامج (SDK) بالأجهزة الأخرى بنجاح، يتلقّى معاودة الاتصال هذه قائمة الأجهزة Participants التي تم اختيارها.

Kotlin

handleDevices = OnDevicePickerResultListener { participants -> participants.forEach {
    // Use participant info
  }
}

Java

handleDevices = participants -> {
   for (Participant participant : participants) {
      // Use participant info
   }
}

بعد تسجيل أداة اختيار الأجهزة، يمكنك تشغيلها باستخدام النسخة الافتراضية devicePickerLauncher. تتطلب DevicePickerLauncher.launchDevicePicker معلَمتين - قائمة بفلاتر الأجهزة (انظر القسم أدناه) وstartComponentRequest. وتُستخدَم السمة startComponentRequest للإشارة إلى النشاط الذي يجب أن يبدأ على الجهاز المستقبِل، وسبب الطلب الذي يظهر للمستخدم.

Kotlin

devicePickerLauncher.launchDevicePicker(
  listOf(),
  startComponentRequest {
    action = "com.example.crossdevice.MAIN"
    reason = "I want to say hello to you"
  },
)

Java

devicePickerLauncher.launchDevicePickerFuture(
    Collections.emptyList(),
    new StartComponentRequest.Builder()
        .setAction("com.example.crossdevice.MAIN")
        .setReason("I want to say hello to you")
        .build());

قبول طلبات الربط

عندما يختار المستخدم جهازًا في منتقي الجهاز، يظهر مربع حوار على جهاز الاستقبال يطلب من المستخدم قبول الاتصال. بعد الموافقة، يتم إطلاق النشاط المستهدف، ويمكن التعامل معه في onCreate وonNewIntent.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  handleIntent(getIntent())
}

override fun onNewIntent(intent: Intent) {
  super.onNewIntent(intent)
  handleIntent(intent)
}

private fun handleIntent(intent: Intent) {
  val participant = Discovery.create(this).getParticipantFromIntent(intent)
  // Accept connection from participant (see below)
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  handleIntent(getIntent());
}

@Override
public void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  handleIntent(intent);
}

private void handleIntent(Intent intent) {
  Participant participant = Discovery.create(this).getParticipantFromIntent(intent);
  // Accept connection from participant (see below)
}

فلاتر الأجهزة

عند اكتشاف الأجهزة، من الشائع أن تحتاج إلى فلترة هذه الأجهزة لعرض الأجهزة ذات الصلة بحالة الاستخدام المطروحة فقط. مثلاً:

  • الفلترة لعرض الأجهزة المزوّدة بكاميرا فقط للمساعدة في مسح رمز الاستجابة السريعة ضوئيًا
  • الفلترة لعرض أجهزة التلفزيون فقط لمشاهدة المحتوى على شاشة كبيرة

بالنسبة إلى معاينة المطوّر هذه، سنبدأ بتوفير إمكانية الفلترة للوصول إلى الأجهزة التي يملكها المستخدم نفسه.

يمكنك تحديد فلتر الأجهزة باستخدام الفئة DeviceFilter:

Kotlin

val deviceFilters = listOf(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY))

Java

List<DeviceFilter> deviceFilters =
    Arrays.asList(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY));

بعد تحديد فلاتر الأجهزة، يمكنك بدء اكتشاف الجهاز.

Kotlin

devicePickerLauncher.launchDevicePicker(deviceFilters, startComponentRequest)

Java

Futures.addCallback(
    devicePickerLauncher.launchDevicePickerFuture(deviceFilters, startComponentRequest),
    new FutureCallback<Void>() {
      @Override
      public void onSuccess(Void result) {
        // do nothing, result will be returned to handleDevices callback
      }

      @Override
      public void onFailure(Throwable t) {
        // handle error
      }
    },
    mainExecutor);

تجدر الإشارة إلى أنّ launchDevicePicker هي دالة غير متزامنة تستخدم الكلمة الرئيسية suspend.