Conexões próximas 2.0: os dois lados solicitam conexões, mas não se conectam com êxito

Estou tentando usar o novoConexões próximas do Android v2.0 API com oP2P_CLUSTER estratégia de conexão. O problema a seguir (no qual os dois dispositivos solicitam conexões, mas não se conectam com êxito) parece ocorrer em vários dispositivos executando o Android K-N. Às vezes, o código obtém uma conexão persistente bem-sucedida ... Às vezes, não.

Nesse cenário, os dois lados estão anunciando e descobrindo, os dois lados se descobrem e os dois lados enviam solicitações de conexão (mas a conexão não é iniciada). É difícil tornar essa situação confiável com um caso de teste específico, mas isso acontece.

Usando o Android Monitor, capturei informações detalhadas sobre como esse cenário se parece de um lado e listei a sequência de eventos abaixo. Nesta sessão em particular, o dispositivo que eu estava monitorando era um telefone KitKat muito barato e o terminal remoto era um tablet Samsung Lollipop (caso isso seja relevante).

O nó remoto é descoberto e emitimosrequestConnection

Imediatamente depois, o Android Monitor mostra este erro:

09-28 11:49:38.706 17321-17823/? E/NearbyConnections: In startClient(), UKEY2 failed with endpoint AqXW
                                                  java.io.IOException: bt socket closed, read return: -1
                                                      at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:647)
                                                      at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                      at java.io.InputStream.read(InputStream.java:162)
                                                      at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:149)
                                                      at java.io.BufferedInputStream.read(BufferedInputStream.java:295)
                                                      at libcore.io.Streams.readFully(Streams.java:81)
                                                      at java.io.DataInputStream.readInt(DataInputStream.java:103)
                                                      at xkj.c(:com.google.android.gms@11509230:1)
                                                      at xkg.run(:com.google.android.gms@11509230:8)
                                                      at mng.run(:com.google.android.gms@11509230:25)
                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                      at mso.run(:com.google.android.gms@11509230)
                                                      at java.lang.Thread.run(Thread.java:818)

Imediatamente depois disso, ele acessa o ResultCallback de requestConnection, comSTATUS_ENDPOINT_IO_ERROR (8012)

Em seguida, porque orequestConnection retornou um erro, paramos a descoberta, esperamos 3 segundos e começamos a descoberta novamente.

A próxima mensagem de rastreamento após reiniciarmos a descoberta é a seguinte: NearbyConnections:

09-28 11:49:46.333 17321-17412/? E/NearbyConnections: onIncomingConnection() for client 308946494 failed to initialize the connection with IkFxWFf_F-sAAAAAAAAAHHA_I2pIK25WaixTQEZSNHtVbmtub3duIFVzZXI
                                                  java.io.IOException: Failed to read ConnectionRequestFrame
                                                      at xjj.a(:com.google.android.gms@11509230:61)
                                                      at xlr.run(:com.google.android.gms@11509230:12)
                                                      at mng.run(:com.google.android.gms@11509230:25)
                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                      at mso.run(:com.google.android.gms@11509230)
                                                      at java.lang.Thread.run(Thread.java:818)
                                                   Caused by: java.io.IOException: bt socket closed, read return: -1
                                                      at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:647)
                                                      at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                      at java.io.InputStream.read(InputStream.java:162)
                                                      at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:149)
                                                      at java.io.BufferedInputStream.read(BufferedInputStream.java:295)
                                                      at libcore.io.Streams.readFully(Streams.java:81)
                                                      at java.io.DataInputStream.readInt(DataInputStream.java:103)
                                                      at xkj.c(:com.google.android.gms@11509230:1)
                                                      at xjj.a(:com.google.android.gms@11509230:56)
                                                      at xlr.run(:com.google.android.gms@11509230:12) 
                                                      at mng.run(:com.google.android.gms@11509230:25) 
                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                      at mso.run(:com.google.android.gms@11509230) 
                                                      at java.lang.Thread.run(Thread.java:818)

Eu estou supondo que o erro acima foi acionado de um requestConnection do outro lado? E se não tivéssemos cometido esse erro, teria sido para o meuonConnectionInitiated ligue de volta? (Só para esclarecer: não atingiu minhaonConnectionInitiated ligue de volta.)

Em seguida, descubro novamente o outro nó erequestConnection mais uma vez.

Imediatamente após isso, vejo a seguinte mensagem de erro (diferente) de NearbyConnections:

09-28 11:51:14.639 17321-17412/? E/NearbyConnections: sendConnectionRequest() for client 308946494 failed to initialize the connection with endpoint AqXW
                                                  xjx: In connectImpl(), failed to connect to Bluetooth device 28:BE:03:0C:F1:5B for endpoint AqXW
                                                      at xlo.a(:com.google.android.gms@11509230:126)
                                                      at xjs.run(:com.google.android.gms@11509230:12)
                                                      at mng.run(:com.google.android.gms@11509230:25)
                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                      at mso.run(:com.google.android.gms@11509230)
                                                      at java.lang.Thread.run(Thread.java:818)

Em seguida, acessamos o ResultCallback do requestConnection comSTATUS_BLUETOOTH_ERROR (8007)

Depois disso, vi os dispositivosconectar e desconectar automaticamente, que se repetiu várias vezes. Eles nunca tiveram uma conexão persistente bem-sucedida, embora eu tenha visto isso acontecer após vários erros.

questionAnswers(1)

yourAnswerToTheQuestion