Почти каждый опыт работы с несколькими устройствами начинается с поиска доступных устройств. Чтобы упростить эту задачу, мы предлагаем Device Discovery API.
Запустить диалоговое окно выбора устройства
Для обнаружения устройств используется системное диалоговое окно, в котором пользователь может выбрать целевое устройство. Чтобы инициировать диалоговое окно выбора устройства, сначала необходимо получить клиент обнаружения устройств и зарегистрировать получатель результатов. Обратите внимание, что, как и в случае с 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.