API обнаружения устройств

Почти каждый опыт работы с несколькими устройствами начинается с поиска доступных устройств. Чтобы упростить эту задачу, мы предлагаем Device Discovery API.

Диалоговое окно с настройками обмена с пользователями поблизости
Рисунок 1. Обмен с пользователями поблизости.

Запустить диалоговое окно выбора устройства

Для обнаружения устройств используется системное диалоговое окно, в котором пользователь может выбрать целевое устройство. Чтобы инициировать диалоговое окно выбора устройства, сначала необходимо получить клиент обнаружения устройств и зарегистрировать получатель результатов. Обратите внимание, что, как и в случае с registerForActivityResult, этот получатель должен быть зарегистрирован безусловно в рамках инициализации объекта activity или фрагмента.

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

Фильтры устройств

При обнаружении устройств часто требуется отфильтровать их, чтобы отображались только те, которые соответствуют текущему сценарию использования. Пример:

  • Показаны только устройства с камерой, чтобы вы могли отсканировать QR-код.
  • Фильтрация по телевизорам для просмотра на большом экране

В этой предварительной версии для разработчиков мы начинаем с возможности фильтрации по устройствам, принадлежащим одному пользователю.

Фильтр по устройствам можно задать с помощью класса 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.