Interfejs API wykrywania urządzeń

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.

Okno z opcjami udostępniania użytkownikom w pobliżu
Rysunek 1. Udostępnianie użytkownikom w pobliżu.

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.