API Device discovery

Presque toutes les expériences multi-appareils commencent par la recherche d'appareils disponibles. Pour simplifier cette tâche courante, nous proposons l'API Device Discovery.

Boîte de dialogue avec les options de partage avec les utilisateurs à proximité
Figure 1: Partage avec des utilisateurs à proximité

Lancer la boîte de dialogue de sélection de l'appareil

La détection d'appareils utilise une boîte de dialogue système pour permettre à l'utilisateur de sélectionner un appareil cible. Pour lancer la boîte de dialogue de sélection des appareils, vous devez d'abord obtenir un client de découverte d'appareil et enregistrer un récepteur de résultats. Notez que, comme pour registerForActivityResult, ce récepteur doit être enregistré de manière inconditionnelle dans le chemin d'initialisation de l'activité ou du fragment.

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

Dans l'extrait de code ci-dessus, l'objet handleDevices n'est pas défini. Une fois que l'utilisateur a choisi les appareils auxquels se connecter et une fois que le SDK s'est connecté aux autres appareils, ce rappel reçoit la liste des Participants sélectionnés.

Kotlin

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

Java

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

Une fois le sélecteur d'appareils enregistré, lancez-le à l'aide de l'instance devicePickerLauncher. DevicePickerLauncher.launchDevicePicker utilise deux paramètres : une liste de filtres d'appareils (voir la section ci-dessous) et un startComponentRequest. Le startComponentRequest permet d'indiquer quelle activité doit être lancée sur l'appareil destinataire et le motif de la requête présentée à l'utilisateur.

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

Accepter les demandes de connexion

Lorsque l'utilisateur sélectionne un appareil dans le sélecteur, une boîte de dialogue s'affiche sur l'appareil récepteur pour lui demander d'accepter la connexion. Une fois acceptée, l'activité cible est lancée, ce qui peut être géré dans onCreate et 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)
}

Filtres d'appareils

Lors de la découverte d'appareils, il est courant de vouloir les filtrer pour n'afficher que ceux qui sont pertinents pour le cas d'utilisation concerné. Par exemple :

  • Filtrage des seuls appareils avec appareil photo pour aider à scanner un code QR
  • Filtrer uniquement sur les téléviseurs pour une expérience de visionnage sur grand écran

Pour cette version Preview développeur, nous commençons par permettre de filtrer les appareils appartenant au même utilisateur.

Vous pouvez spécifier le filtre d'appareil à l'aide de la classe DeviceFilter:

Kotlin

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

Java

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

Une fois les filtres d'appareils définis, vous pouvez lancer la détection d'appareils.

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

Notez que launchDevicePicker est une fonction asynchrone qui utilise le mot clé suspend.