Prawie każde korzystanie z wielu urządzeń zaczyna się od znalezienia dostępnych urządzeń. Aby uprościć to typowe zadanie, oferujemy interfejs Device Discovery API.
Otwórz okno wyboru urządzenia
Wykrywanie urządzeń korzysta z okna systemowego, aby umożliwiać użytkownikowi wybranie urządzenia docelowego. Aby zainicjować okno wyboru urządzeń, musisz najpierw pobrać klienta wykrywania urządzeń i zarejestrować odbiornik. Pamiętaj, że podobnie jak w funkcji registerForActivityResult
ten odbiornik musi być zarejestrowany bezwarunkowo jako część ścieżki inicjowania działania lub fragmentu.
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); }
We fragmencie kodu powyżej znajduje się niezdefiniowany obiekt handleDevices
. Gdy użytkownik wybierze urządzenia, z którymi ma się połączyć, i pakiet SDK połączy się z innymi urządzeniami, wywołanie zwrotne otrzyma listę wybranych elementów Participants
.
Kotlin
handleDevices = OnDevicePickerResultListener { participants -> participants.forEach { // Use participant info } }
Java
handleDevices = participants -> { for (Participant participant : participants) { // Use participant info } }
Po zarejestrowaniu selektora urządzeń uruchom go za pomocą instancji devicePickerLauncher
. DevicePickerLauncher.launchDevicePicker
przyjmuje 2 parametry – listę filtrów urządzeń (patrz sekcja poniżej) i startComponentRequest
. Pole startComponentRequest
służy do wskazywania, które działanie powinno zostać rozpoczęte na urządzeniu odbierającym oraz dlaczego żądanie jest wyświetlane użytkownikowi.
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());
Zaakceptuj prośby o połączenie
Gdy użytkownik wybierze urządzenie w selektorze urządzeń, na urządzeniu odbierającym pojawi się okno z prośbą o zaakceptowanie połączenia. Po zaakceptowaniu działa docelowe działanie, które można wykonać w systemach onCreate
i 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) }
Filtry urządzeń
Podczas wykrywania urządzeń często warto filtrować je, aby wyświetlać tylko te związane z danym przypadkiem użycia. Na przykład:
- Filtruję tylko do urządzeń z aparatem w celu zeskanowania kodu QR
- Filtrowanie tylko na telewizory, aby oglądać treści na dużym ekranie
W tej wersji przedpremierowej dla programistów zaczniemy od filtrowania według urządzeń należących do tego samego użytkownika.
Możesz określić filtr urządzeń przy użyciu klasy DeviceFilter
:
Kotlin
val deviceFilters = listOf(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY))
Java
List<DeviceFilter> deviceFilters = Arrays.asList(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY));
Po zdefiniowaniu filtrów urządzeń możesz zainicjować wykrywanie urządzeń.
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);
Zwróć uwagę, że launchDevicePicker
to funkcja asynchroniczna, która używa słowa kluczowego suspend
.