Как подключить 3+ устройства с помощью API Google-Nearby Connection - PullRequest
0 голосов
/ 29 января 2020

Я создаю приложение, которое должно подключать как минимум 4 устройства, используя близлежащий интерфейс API. Я могу их периодически подключать, иначе подключаются только два устройства.

Я использую топологию P2P-CLUSTER и отправляю данные как полезные данные файла, которые успешно отправляются. У меня два вопроса:

  1. Любое предложение о том, как установить стабильное соединение между 2+ устройствами.
  2. При отправке данных в виде полезных данных файла в папке загрузки создается папка. Есть ли способ отменить этот шаг и иметь возможность отправлять данные напрямую в виде файловых данных без необходимости сохранять их локально.

Вот мой код, касающийся только части соединения.

  private final EndpointDiscoveryCallback endpointDiscoveryCallback =
        new EndpointDiscoveryCallback() {
            @Override
            public void onEndpointFound(String endpointId, final DiscoveredEndpointInfo info) {

                arrlist.add(endpointId);
                for (int i = 0; i< arrlist.size(); i++) {
                    connectionsClient
                            .requestConnection(Build.MODEL, arrlist.get(i), connectionLifecycleCallback)
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                }
                            });
                }
            }

            @Override
            public void onEndpointLost(@NonNull String endpointId) {
            }
        };


private final ConnectionLifecycleCallback connectionLifecycleCallback =
        new ConnectionLifecycleCallback() {
            @Override
            public void onConnectionInitiated(@NonNull String endpointId, @NonNull ConnectionInfo connectionInfo) {
                // Automatically accept the connection on both sides.
                connectionsClient.acceptConnection(endpointId, new PayloadCallback() {
                    @Override
                    public void onPayloadReceived(@NonNull String s, @NonNull Payload payload) {
                        }
                    }

                    @Override
                    public void onPayloadTransferUpdate(@NonNull String s, @NonNull PayloadTransferUpdate payloadTransferUpdate) {

            }

            @Override
            public void onConnectionResult(@NonNull String endpointId, ConnectionResolution result) {
                switch (result.getStatus().getStatusCode()) {
                    case ConnectionsStatusCodes.STATUS_OK:
                        if(arrlist != null && arrlist.contains(endpointId)){
                            System.out.println(TAG+ " End Point Found");
                        } else {
                            arrlist.add(endpointId);
                        }

                        connectionsClient.stopDiscovery();
                        connectionsClient.stopAdvertising();
                        break;
                    case ConnectionsStatusCodes.STATUS_CONNECTION_REJECTED:
                        // Some code 
                        break;
                    case ConnectionsStatusCodes.STATUS_ERROR:
                        // Some code
                        break;
                    default:
                }
            }

            @Override
            public void onDisconnected(@NonNull String endpointId) {
             // some code
            }
        };

  private void startAdvertising() {
    AdvertisingOptions advertisingOptions =
            new AdvertisingOptions.Builder().setStrategy(STRATEGY).build();
    Nearby.getConnectionsClient(context)
            .startAdvertising(
                    android.os.Build.MODEL, getPackageName(), connectionLifecycleCallback, advertisingOptions)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {

                }
            })
            .addOnFailureListener(new OnFailureListener() {
                                      @Override
                                      public void onFailure(@NonNull Exception e) {

                                      }
                                  });
}

private void startDiscovery() {
    DiscoveryOptions discoveryOptions =
            new DiscoveryOptions.Builder().setStrategy(STRATEGY).build();
    Nearby.getConnectionsClient(context)
            .startDiscovery(getPackageName(), endpointDiscoveryCallback, discoveryOptions)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                      @Override
                                      public void onSuccess(Void aVoid) {
                                      }
                                  })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                }
            });
}
...