Device Discovery API

Nahezu jedes geräteübergreifende Nutzungserlebnis beginnt mit der Suche nach verfügbaren Geräten. Um diese häufige Aufgabe zu vereinfachen, bieten wir die Device Discovery API an.

Dialogfeld mit Freigabeoptionen für Nutzer in der Nähe
Abbildung 1: Mit Nutzern in der Nähe teilen.

Dialogfeld zur Geräteauswahl öffnen

Bei der Geräteerkennung wird ein Systemdialogfeld verwendet, über das der Nutzer ein Zielgerät auswählen kann. Um das Dialogfeld zur Geräteauswahl zu starten, müssen Sie zuerst einen Geräteerkennungs-Client anfordern und einen Ergebnisempfänger registrieren. Ähnlich wie registerForActivityResult muss dieser Empfänger bedingungslos als Teil des Aktivitäts- oder Fragmentinitialisierungspfads registriert werden.

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

Das Code-Snippet oben enthält ein nicht definiertes handleDevices-Objekt. Nachdem der Nutzer die Geräte ausgewählt hat, zu denen eine Verbindung hergestellt werden soll, und nachdem das SDK eine Verbindung zu den anderen Geräten hergestellt hat, empfängt dieser Callback die Liste der ausgewählten Participants.

Kotlin

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

Java

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

Nachdem die Geräteauswahl registriert wurde, starten Sie sie mit der Instanz devicePickerLauncher. DevicePickerLauncher.launchDevicePicker verwendet zwei Parameter: eine Liste von Gerätefiltern (siehe Abschnitt unten) und einen startComponentRequest. Mit startComponentRequest wird angegeben, welche Aktivität auf dem empfangenden Gerät gestartet werden soll, und um den Grund für die Anfrage anzugeben, der dem Nutzer angezeigt wird.

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

Verbindungsanfragen annehmen

Wenn der Nutzer in der Geräteauswahl ein Gerät auswählt, wird auf dem empfangenden Gerät ein Dialogfeld angezeigt, in dem der Nutzer aufgefordert wird, die Verbindung zu akzeptieren. Nach der Annahme wird die Zielaktivität gestartet, die in onCreate und onNewIntent verarbeitet werden kann.

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

Gerätefilter

Bei der Geräteerkennung ist es üblich, diese Geräte zu filtern, um nur die anzuzeigen, die für den jeweiligen Anwendungsfall relevant sind. Beispiele:

  • Filtert nur Geräte mit Kamera, um den QR-Code zu scannen
  • Für die Darstellung auf einem großen Bildschirm nach Fernsehern filtern

Im Rahmen dieser Entwicklervorschau haben wir die Möglichkeit, nach Geräten desselben Nutzers zu filtern.

Sie können den Gerätefilter mit der Klasse DeviceFilter angeben:

Kotlin

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

Java

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

Nachdem Sie die Gerätefilter definiert haben, können Sie die Gerätesuche starten.

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

Beachten Sie, dass launchDevicePicker eine asynchrone Funktion ist, die das Schlüsselwort suspend verwendet.