API Device Discovery

Quasi ogni esperienza multidispositivo inizia con la ricerca dei dispositivi disponibili. Per semplificare questa operazione comune, offriamo l'API Device Discovery.

Finestra di dialogo con opzioni di condivisione con gli utenti nelle vicinanze
Figura 1: condivisione con utenti nelle vicinanze.

Avvia la finestra di dialogo di selezione del dispositivo

Il rilevamento dei dispositivi utilizza una finestra di dialogo di sistema per consentire all'utente di selezionare un dispositivo di destinazione. Per avviare la finestra di dialogo di selezione del dispositivo, devi prima ottenere un client di rilevamento dei dispositivi e registrare un ricevitore dei risultati. Tieni presente che, come per registerForActivityResult, questo ricevitore deve essere registrato incondizionatamente come parte del percorso di inizializzazione dei frammenti o dell'attività.

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

Nello snippet di codice riportato sopra, abbiamo un oggetto handleDevices non definito. Dopo che l'utente ha scelto i dispositivi a cui connettersi e dopo che l'SDK si è connesso agli altri dispositivi, questo callback riceve l'elenco dei Participants selezionati.

Kotlin

handleDevices = OnDevicePickerResultListener { participants -> participants.forEach {
    // Use participant info
  }
}

Java

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

Dopo aver registrato il selettore dispositivo, avvialo utilizzando l'istanza devicePickerLauncher. DevicePickerLauncher.launchDevicePicker utilizza due parametri: un elenco di filtri per dispositivo (vedi la sezione di seguito) e un startComponentRequest. startComponentRequest viene utilizzato per indicare quale attività deve essere avviata sul dispositivo ricevente e il motivo della richiesta mostrata all'utente.

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

Accetta le richieste di connessione

Quando l'utente seleziona un dispositivo nel selettore del dispositivo, sul dispositivo ricevente viene visualizzata una finestra di dialogo per chiedergli di accettare la connessione. Una volta accettata, viene avviata l'attività target, che può essere gestita in onCreate e 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)
}

Filtri per dispositivo

Durante la scoperta dei dispositivi, è comune filtrare questi dispositivi in modo da mostrare solo quelli pertinenti al caso d'uso in questione. Ecco alcuni esempi:

  • Applicazione di filtri solo ai dispositivi con fotocamera per facilitare la scansione di un codice QR
  • Applicazione di filtri solo alle TV per un'esperienza di visualizzazione sullo schermo di casa

Per questa anteprima per sviluppatori, inizieremo con la possibilità di filtrare in base ai dispositivi di proprietà dello stesso utente.

Puoi specificare il filtro dei dispositivi utilizzando la classe DeviceFilter:

Kotlin

val deviceFilters = listOf(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY))

Java

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

Dopo aver definito i filtri dei dispositivi, puoi avviare il rilevamento dei dispositivi.

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

Nota che launchDevicePicker è una funzione asincrona che utilizza la parola chiave suspend.