API Device Discovery

Quase todas as experiências com vários dispositivos começam com a localização dos dispositivos disponíveis. Para simplificar essa tarefa comum, oferecemos a API Device Discovery.

Caixa de diálogo com opções de compartilhamento com usuários por perto
Figura 1: compartilhar com usuários por perto.

Abrir a caixa de diálogo de seleção de dispositivo

A descoberta de dispositivos usa uma caixa de diálogo do sistema para permitir que o usuário selecione um dispositivo de destino. Para iniciar a caixa de diálogo de seleção de dispositivos, primeiro você precisa conseguir um cliente de descoberta de dispositivos e registrar um receptor de resultados. Observe que, semelhante a registerForActivityResult, esse receptor precisa ser registrado incondicionalmente como parte do caminho de inicialização da atividade ou do 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);
}

No snippet de código acima, temos um objeto handleDevices indefinido. Depois que o usuário escolhe os dispositivos para se conectar e o SDK se conecta aos outros dispositivos, esse callback recebe a lista de Participants selecionados.

Kotlin

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

Java

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

Depois que o seletor de dispositivo for registrado, inicie-o usando a instância devicePickerLauncher. O DevicePickerLauncher.launchDevicePicker usa dois parâmetros: uma lista de filtros de dispositivo (consulte a seção abaixo) e um startComponentRequest. O startComponentRequest é usado para indicar qual atividade vai ser iniciada no dispositivo receptor e o motivo da solicitação que é mostrado ao usuário.

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

Aceitar solicitações de conexão

Quando o usuário seleciona um dispositivo no seletor, uma caixa de diálogo é exibida no dispositivo de recebimento para solicitar que o usuário aceite a conexão. Depois de aceita, a atividade de destino é iniciada, o que pode ser processada em 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)
}

Filtros de dispositivos

Ao descobrir dispositivos, é comum filtrá-los para mostrar apenas os relevantes para o caso de uso em questão. Por exemplo:

  • Filtrar apenas dispositivos com câmera para ajudar a ler um código QR
  • Filtrar apenas para TVs para uma experiência de visualização em tela grande

Nesta prévia para desenvolvedores, estamos começando com a capacidade de filtrar dispositivos do mesmo usuário.

É possível especificar o filtro de dispositivo usando a classe DeviceFilter:

Kotlin

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

Java

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

Depois de definir os filtros, você pode iniciar a descoberta 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);

Observe que launchDevicePicker é uma função assíncrona que usa a palavra-chave suspend.