0

我想在我的应用程序中使用附近的连接。现在我只使用预连接状态。我唯一应该知道的是一个设备是否在另一个设备的视线范围内。但是要求发生了变化,所以现在我需要在开始其他进程之前连接两个设备。所以现在我有几个问题:

  1. 我想传递给发现者的唯一东西是一个字符串。我不需要真正的流或其他东西。但是,如果我只在不到一分钟的时间内收到断开连接时才传递字符串。但正如我之前提到的,我需要有一个开放的连接。所以现在我决定每 40 秒传递一次相同的字符串。它似乎没用,但我找不到另一种保持连接打开的方法
  2. 谷歌文档说:

根据您的用例,您可能希望向用户显示已发现设备的列表,允许他们选择要连接的设备。

但我找不到如何向用户显示可用连接的示例。当前解决方案:

private val connectionLifecycleCallback: ConnectionLifecycleCallback =
        object : ConnectionLifecycleCallback() {
            override fun onConnectionInitiated(endpointId: String, connectionInfo: ConnectionInfo) {
                Timber.e("onConnectionInitiated $endpointId")
                Nearby.getConnectionsClient(context).acceptConnection(endpointId, receiveBytesPayloadListener)
                //automatic connection from both sides
            }

            override fun onConnectionResult(endpointId: String, result: ConnectionResolution) {
                Timber.e("onConnectionResult $endpointId")
                when (result.status.statusCode) {
                    ConnectionsStatusCodes.STATUS_OK -> {
                        Timber.e("onConnectionResult.STATUS_OK $endpointId ")
                        val bytesPayload = Payload.fromBytes("${UserRepo.rideId} ".toByteArray())
                        myTimer = Timer()
                        myTimer?.schedule(object : TimerTask() {
                            override fun run() {
                                Nearby.getConnectionsClient(context).sendPayload(endpointId, bytesPayload)
                            }
                        }, 0, 40_000)
                    }
                    ConnectionsStatusCodes.STATUS_CONNECTION_REJECTED -> {
                        Timber.e("onConnectionResult.STATUS_CONNECTION_REJECTED ")
                    }
                    ConnectionsStatusCodes.STATUS_ERROR -> {
                        Timber.e("onConnectionResult.STATUS_ERROR ")
                    }
                    else -> {
                    }
                }
            }

            override fun onDisconnected(endpointId: String) {
                Timber.e("onDisconnected... $endpointId")
            }
        }

提前致谢。

4

1 回答 1

0

当您开始发现时,您应该传递 EndpointDiscoveryCallback,如下所示:

public void startDiscovering(EndpointDiscoveryCallback endpointDiscoveryCallback, Strategy strategy){
        DiscoveryOptions discoveryOptions = new DiscoveryOptions.Builder().setStrategy(strategy).build();
        connectionsClient.startDiscovery(
                SERVICE_ID,
                endpointDiscoveryCallback,
                discoveryOptions)
                .addOnSuccessListener(
                (Void unused) -> {
                    Log.e("Discovery Start", "Discovery started successfully");
                }).addOnFailureListener(
                (Exception e) -> {
                    Log.e("Discovery Start", e.getLocalizedMessage());
                });
    }

每次在您附近发现新设备时,此 EndpointDiscoveryCallback 都会为您提供端点信息。这将允许您列出已发现的设备。

public class MyEndpointDiscoveryCallback extends EndpointDiscoveryCallback {

    @Override
    public void onEndpointFound(@NonNull String endpointId, @NonNull DiscoveredEndpointInfo discoveredEndpointInfo) {
        // new device discovered
    }

    @Override
    public void onEndpointLost(@NonNull String endpointId) {
        // discovered device lost
    }
}
于 2021-05-25T17:18:07.200 回答