Почти каждый опыт работы с несколькими устройствами начинается с поиска доступных устройств. Чтобы упростить эту распространенную задачу, мы предлагаем API обнаружения устройств.
Запустить диалог выбора устройства
Для обнаружения устройств используется системный диалог, позволяющий пользователю выбрать целевое устройство. Чтобы инициировать диалог выбора устройства, сначала необходимо получить клиент обнаружения устройств и зарегистрировать приемник результатов. Обратите внимание, что, как и в случае с registerForActivityResult
, этот получатель должен быть зарегистрирован безоговорочно как часть пути инициализации действия или фрагмента.
Котлин
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) devicePickerLauncher = Discovery.create(this).registerForResult(this, handleDevices) }
Ява
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); devicePickerLauncher = Discovery.create(this).registerForResult(this, handleDevices); }
В приведенном выше фрагменте кода у нас есть неопределенный объект handleDevices
. После того как пользователь выберет устройства для подключения и SDK успешно подключится к другим устройствам, этот обратный вызов получает список выбранных Participants
.
Котлин
handleDevices = OnDevicePickerResultListener { participants -> participants.forEach { // Use participant info } }
Ява
handleDevices = participants -> { for (Participant participant : participants) { // Use participant info } }
После регистрации средства выбора устройства запустите его с помощью экземпляра devicePickerLauncher
. DevicePickerLauncher.launchDevicePicker
принимает два параметра — список фильтров устройств (см. раздел ниже) и startComponentRequest
. startComponentRequest
используется для указания того, какое действие должно быть запущено на принимающем устройстве, а также причины запроса, который отображается пользователю.
Котлин
devicePickerLauncher.launchDevicePicker( listOf(), startComponentRequest { action = "com.example.crossdevice.MAIN" reason = "I want to say hello to you" }, )
Ява
devicePickerLauncher.launchDevicePickerFuture( Collections.emptyList(), new StartComponentRequest.Builder() .setAction("com.example.crossdevice.MAIN") .setReason("I want to say hello to you") .build());
Принимать запросы на подключение
Когда пользователь выбирает устройство в средстве выбора устройств, на принимающем устройстве появляется диалоговое окно с просьбой принять соединение. После принятия запускается целевая активность, которую можно обрабатывать в onCreate
и onNewIntent
.
Котлин
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) }
Ява
@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
:
Котлин
val deviceFilters = listOf(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY))
Ява
List<DeviceFilter> deviceFilters = Arrays.asList(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY));
Определив фильтры устройств, вы можете начать обнаружение устройств.
Котлин
devicePickerLauncher.launchDevicePicker(deviceFilters, startComponentRequest)
Ява
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
.