Interfejs API wykrywania urządzeń

Niemal każde korzystanie z wielu urządzeń rozpoczyna się od znalezienia dostępnych urządzeń. Do 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 plików użytkownikom w pobliżu

Otwórz okno wyboru urządzenia

Wykrywanie urządzeń używa okna systemowego, aby umożliwić użytkownikowi wybranie urządzenia docelowego. Do otwórz okno wyboru urządzenia, klienta i zarejestrują odbiorcę wyników. Pamiętaj, że podobnie jak registerForActivityResult, ten odbiorca musi być bezwarunkowo zarejestrowany jako należy do ścieżki inicjowania aktywności lub fragmentów.

KotlinJava
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);
}

We fragmencie kodu powyżej znajduje się niezdefiniowany obiekt handleDevices. Po użytkownik wybiera urządzenia, z którymi ma się połączyć, a gdy pakiet SDK się sprawdzi, łączy się z innymi urządzeniami, to wywołanie zwrotne otrzymuje listę Participants zaznaczono.

KotlinJava
handleDevices = OnDevicePickerResultListener { participants -> participants.forEach {
   
// Use participant info
 
}
}
handleDevices = participants -> {
   
for (Participant participant : participants) {
     
// Use participant info
   
}
}

Po zarejestrowaniu selektora urządzeń uruchom go za pomocą polecenia devicePickerLauncher instancji. Funkcja DevicePickerLauncher.launchDevicePicker ma 2 parametry: listę filtrów urządzeń (patrz sekcja poniżej) oraz startComponentRequest. startComponentRequest służy do wskazywania, które działanie ma być rozpoczęte urządzenie odbierające oraz powód żądania wyświetlany użytkownikowi.

KotlinJava
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());

Akceptuj prośby o połączenie

Gdy użytkownik wybierze urządzenie w selektorze urządzeń, na aby poprosić użytkownika o zaakceptowanie połączenia. Po zaakceptowaniu uruchomiona jest docelowa aktywność, która może być obsługiwana w onCreate oraz onNewIntent

KotlinJava
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)
}

Filtry urządzeń

Często przy wykrywaniu urządzeń warto filtrować je tylko w celu które pasują do danego przypadku użycia. Na przykład:

  • Filtrowanie tylko urządzeń z aparatem ułatwia skanowanie kodu QR
  • Filtrowanie wyświetla tylko na telewizory, aby można było oglądać je na dużym ekranie.

W tej wersji przedpremierowej dla programistów zaczynamy od możliwości filtrowania w celu urządzeń należących do tego samego użytkownika.

Filtr urządzeń możesz określić za pomocą klasy DeviceFilter:

KotlinJava
val deviceFilters = listOf(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY))
List<DeviceFilter> deviceFilters =
   
Arrays.asList(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY));

Po zdefiniowaniu filtrów urządzeń możesz zainicjować wykrywanie urządzeń.

KotlinJava
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
);

Zwróć uwagę, że launchDevicePicker jest funkcją asynchroniczną, która korzysta z suspend słowo kluczowe.