A Nearby Connections é uma API de rede ponto a ponto que permite que os apps descubram, se conectem e troquem dados facilmente com dispositivos próximos em tempo real, independentemente da conectividade de rede. A API está localizada no pacote
com.google.android.gms.nearby.connection
.
Alguns exemplos de casos de uso:
- Lousa interativa para colaboração: anote ideias com participantes próximos em uma lousa interativa virtual compartilhada.
- Jogos multiplayer locais: configure um jogo multiplayer e convide outros usuários próximos para participar.
- Jogos com várias telas: use um smartphone ou tablet como controle de jogo para exibir jogos exibidos em um dispositivo Android de tela grande próximo, como o Android TV.
- Transferências de arquivos off-line: compartilhe fotos, vídeos ou qualquer outro tipo de dados rapidamente e sem precisar de uma conexão de rede.
Introdução
O Nearby Connections permite a divulgação, a descoberta e as conexões entre dispositivos próximos de maneira totalmente off-line ponto a ponto. As conexões entre dispositivos são de alta largura de banda, baixa latência e totalmente criptografadas para permitir transferências de dados rápidas e seguras.
Um dos principais objetivos dessa API é oferecer uma plataforma simples, confiável e com alto desempenho. Internamente, a API usa uma combinação de pontos de acesso Bluetooth, BLE e Wi-Fi, aproveitando os pontos fortes de cada um e burlando os pontos fracos deles. Isso abstrai com eficiência os ritmos de Bluetooth e Wi-Fi em várias versões de SO e hardware Android, permitindo que os desenvolvedores se concentrem nos recursos mais importantes para os usuários.
Por conveniência, os usuários não recebem uma solicitação para ativar o Bluetooth ou o Wi-Fi. O recurso Conexões próximas ativa esses recursos conforme necessário e restaura o dispositivo ao estado anterior depois que o app é concluído usando a API, garantindo uma experiência tranquila para o usuário.
Perspectiva geral sobre APIs
O uso da API é dividido em duas fases: pré-conexão e pós-conexão.
Na fase de pré-conexão, os anunciantes se anunciam, enquanto os Discoverres descobrem anunciantes próximos e enviam solicitações de conexão. Uma solicitação de conexão de um Discoverr para um Anunciante inicia um fluxo de autenticação simétrica que faz com que os dois lados aceitem (ou rejeitem) a solicitação de conexão.
Depois que uma solicitação de conexão é aceita pelos dois lados, ela é considerada estabelecida e os dispositivos entram na fase pós-conexão, em que ambos os lados podem trocar dados.
Publicidade e descoberta
Os anunciantes começam invocando startAdvertising()
, transmitindo um
ConnectionLifecycleCallback
que será notificado sempre que um Discoverer quiser
se conectar usando o callback onConnectionInitiated()
.
Os leitores começam invocando startDiscovery()
, transmitindo um EndpointDiscoveryCallback
que será notificado sempre que um anunciante próximo for encontrado pelo callback onEndpointFound()
.
Estabelecer conexões
Quando um Discoverr quer se conectar a um anunciante nas proximidades, ele
invoca requestConnection()
, transmitindo um ConnectionLifecycleCallback
.
Os dois lados são notificados do processo de início de conexão pelo callback
ConnectionLifecycleCallback.onConnectionInitiated()
e ambos precisam escolher
se querem aceitar ou rejeitar a conexão usando uma chamada para
acceptConnection()
ou rejectConnection()
, respectivamente.
Nesse momento, os apps podem solicitar que o usuário aceite a conexão. Consulte Autenticar uma conexão para saber mais.
Depois que os dois lados responderem, cada um será notificado sobre o resultado pelo
callback ConnectionLifecycleCallback.onConnectionResult()
. Se ambos os lados
tiverem aceitado a conexão, o ConnectionResolution
fornecido no
callback terá sucesso, a conexão será considerada estabelecida e será possível iniciar
a transferência dos payloads.
Troca de dados
Depois que uma conexão é estabelecida, o uso adicional da API é simétrico. Portanto, não há mais distinção entre Anunciante e Discoverer.
Agora os dois lados podem trocar dados como objetos Payload
. Há três tipos de
payloads compatíveis:
BYTES
Matrizes de bytes limitadas a 32 mil. Elas são boas para enviar itens como metadados ou mensagens de controle.FILE
Arquivos de qualquer tamanho. Eles são transferidos do app para a interface de rede, com cópia mínima entre os limites do processo.STREAM
Um stream de dados gerado instantaneamente, como no caso de áudio/vídeo gravado, sem tamanho final conhecido.
Os remetentes usam o método sendPayload()
para enviar um payload. Esse método pode ser
invocado várias vezes, mas como garantimos a entrega em ordem, o segundo
Payload será colocado na fila para envio até que o primeiro seja concluído.
Os destinatários podem esperar que o callback PayloadCallback.onPayloadReceived()
seja
invocado quando um novo payload de entrada for recebido.
Os remetentes e os destinatários podem esperar que o
callback PayloadCallback.onPayloadTransferUpdate()
seja invocado para atualizá-los
sobre o progresso dos payloads de saída e de entrada, respectivamente.
As conexões estabelecidas são full-duplex, o que significa que anunciantes e descobertores podem enviar e receber payloads simultaneamente.
Desconectando
Por fim, disconnectFromEndpoint()
se desconecta de um endpoint remoto
específico e o stopAllEndpoints()
se desconecta de todos os endpoints conectados.
Os endpoints remotos são notificados sobre desconexão usando o
ConnectionLifecycleCallback.onDisconnected()
.
Coleta de dados
Ao usar o SDK de proximidade do Google Play Services, a análise de uso é coletada para melhorar a experiência.
- Métricas de desempenho: a latência de descoberta e conexão, a confiabilidade e a capacidade de processamento são coletadas ao procurar e se conectar a dispositivos usando o SDK do Nearby.
- Informações do dispositivo: o modelo do dispositivo, o país, a versão do build e o nome do pacote do app são coletados e associados às métricas de desempenho para identificar frações regionais e específicas do dispositivo.
Os usuários finais podem permitir ou negar a coleta em Configurações > Google > Uso e diagnósticos.