API de detección de dispositivos

Casi todas las experiencias multidispositivo empiezan con la búsqueda de los dispositivos disponibles. Para simplificar esta tarea común, ofrecemos la API de Device Discovery.

Cuadro de diálogo con opciones para compartir con usuarios cercanos
Figura 1: Comparte contenido con usuarios cercanos.

Inicia el diálogo de selección de dispositivos

La detección de dispositivos usa un diálogo del sistema para permitir que el usuario seleccione un dispositivo de destino. Para iniciar el diálogo de selección de dispositivos, primero debes obtener un cliente de descubrimiento de dispositivos y registrar un receptor de resultados. Ten en cuenta que, al igual que con registerForActivityResult, este receptor debe registrarse incondicionalmente como parte de la ruta de inicialización de la actividad o el fragmento.

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

En el fragmento de código anterior, tenemos un objeto handleDevices no definido. Una vez que el usuario elige los dispositivos a los que quiere conectarse, y una vez que el SDK se conecta correctamente a los otros dispositivos, esta devolución de llamada recibe la lista de Participants seleccionados.

Kotlin

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

Java

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

Después de registrar el selector de dispositivos, inícialo con la instancia devicePickerLauncher. DevicePickerLauncher.launchDevicePicker toma dos parámetros: una lista de filtros de dispositivos (consulta la sección a continuación) y un startComponentRequest. startComponentRequest se usa para indicar qué actividad se debe iniciar en el dispositivo receptor y el motivo de la solicitud que se muestra al usuario.

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

Aceptar solicitudes de conexión

Cuando el usuario selecciona un dispositivo en el selector de dispositivos, aparece un diálogo en el dispositivo receptor para solicitarle al usuario que acepte la conexión. Una vez aceptada, se inicia la actividad objetivo, que se puede controlar en onCreate y 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)
}

Filtros de dispositivos

Cuando se detectan dispositivos, es común querer filtrarlos para mostrar solo los relevantes para el caso de uso en cuestión. Por ejemplo:

  • Filtrado solo para dispositivos con cámara para ayudar a escanear un código QR
  • Filtrado para mostrar solo TVs para una experiencia de visualización en pantalla grande

En esta versión preliminar para desarrolladores, comenzamos con la capacidad de filtrar por dispositivos que pertenecen al mismo usuario.

Puedes especificar el filtro de dispositivos con la clase DeviceFilter:

Kotlin

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

Java

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

Una vez que hayas definido los filtros, podrás iniciar la detección de dispositivos.

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

Ten en cuenta que launchDevicePicker es una función asíncrona que usa la palabra clave suspend.