API Device Discovery

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

Caixa de diálogo com opções de compartilhamento para usuários nas proximidades
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 dispositivo, primeiro você precisa fazer uma descoberta de dispositivo cliente e registrar um receptor de resultado. Semelhante a registerForActivityResult, este receptor precisa ser registrado incondicionalmente como parte da atividade ou do caminho de inicialização do fragmento.

override fun onCreate(savedInstanceState: Bundle?) {
 
super.onCreate(savedInstanceState)
  devicePickerLauncher
= Discovery.create(this).registerForResult(this, handleDevices)
}
@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 o usuário escolhe os dispositivos para se conectar e, depois que o SDK se conectar a outros dispositivos, esse callback receberá a lista de Participants selecionados.

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

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

devicePickerLauncher.launchDevicePicker(
  listOf
(),
  startComponentRequest
{
    action
= "com.example.crossdevice.MAIN"
    reason
= "I want to say hello to you"
 
},
)
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 do dispositivo receptor para que o usuário aceite a conexão. Depois de aceita, a a atividade de destino é iniciada, o que pode ser processado em onCreate e onNewIntent.

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

Ao descobrir dispositivos, é comum querer filtrá-los para e mostrar os que são relevantes para o caso de uso em questão. Exemplo:

  • Filtrar apenas dispositivos com câmera para facilitar a leitura do QR code
  • Filtrar para apenas TVs para uma experiência de exibição em tela grande

Para esta prévia para desenvolvedores, estamos começando com a capacidade de filtrar para dispositivos que pertencem ao mesmo usuário.

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

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

Depois de definir os filtros de dispositivo, você pode iniciar a descoberta de dispositivos.

devicePickerLauncher.launchDevicePicker(deviceFilters, startComponentRequest)
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 o suspend palavra-chave.