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

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

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

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

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