google-play-services - 附近的连接2.0简单的文件交换应用程序

标签 google-play-services google-nearby

我正在尝试编写简单的 Android 文件交换应用程序,主要使用 https://developers.google.com/nearby/connections/android/exchange-data 中的片段。和对讲机应用程序。

但是我被困在传输文件有效负载第二个sendPayload,onPayloadTransferUpdate仅在发送端调用。发现、广告、连接到端点,一切正常。发送方正在“发送”,但接收方仅获取带有 id 和文件名的字符串消息并等待(onPayloadTransferUpdate 对于第一个 sendPayload 仅调用了 2 次),然后什么也没有,发送方完成传输后断开连接。

public void sendFile(String uri) {
    File file = new File(uri);
    if (file.exists() && mEstablishedConnections.values().size() > 0) {
        for (Endpoint endpoint : mEstablishedConnections.values()) {
            try {
                // Open the ParcelFileDescriptor for this URI with read access.
                ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(Uri.fromFile(file), "r");

                Payload filePayload = Payload.fromFile(pfd);

                // Construct a simple message mapping the ID of the file payload to the desired filename.
                String payloadFilenameMessage = filePayload.getId() + ":" + Uri.fromFile(file).getLastPathSegment();

                // Send this message as a bytes payload.
                Nearby.Connections.sendPayload(mGoogleApiClient,
                        endpoint.getId(),
                        Payload.fromBytes(payloadFilenameMessage.getBytes("UTF-8")));

                // Finally, send the file payload.
                Nearby.Connections.sendPayload(mGoogleApiClient,
                        endpoint.getId(),
                        filePayload);


            } catch (FileNotFoundException | UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    } else {
        Log.e(TAG, "sendFile: EstablishedConnections == 0");
    }
}

private final PayloadCallback mPayloadCallback = new PayloadCallback() {

    @Override
    public void onPayloadReceived(String endpointId, Payload payload) {
        Log.d(TAG, String.format("onPayloadReceived(endpointId=%s, payload=%s)", endpointId, payload));

        try {
            if (payload.getType() == Payload.Type.BYTES) {
                Log.d(TAG, "onPayloadReceived: Payload.Type.BYTES");
                String payloadFilenameMessage = new String(payload.asBytes(), "UTF-8");
                Log.d(TAG, "onPayloadReceived: BYTES " + payloadFilenameMessage);
                addPayloadFilename(payloadFilenameMessage);
            } else if (payload.getType() == Payload.Type.FILE) {
                // Add this to our tracking map, so that we can retrieve the payload later.
                incomingFilePayloads.put(payload.getId(), payload);

                Log.d(TAG, "onPayloadReceived: Payload.Type.FILE");
            } else if (payload.getType() == Payload.Type.STREAM) {
                //payload.asStream().asInputStream()
                Log.d(TAG, "onPayloadReceived: Payload.Type.STREAM");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onPayloadTransferUpdate(String endpointId, PayloadTransferUpdate update) {
        Log.d(TAG, String.format("onPayloadTransferUpdate(endpointId=%s, update=%s)",
                endpointId, update));

        switch(update.getStatus()) {
            case PayloadTransferUpdate.Status.IN_PROGRESS:
                break;
            case PayloadTransferUpdate.Status.SUCCESS:
                Log.d(TAG, "onPayloadTransferUpdate: SUCCESS");
                Payload payload = incomingFilePayloads.remove(update.getPayloadId());
                 if (payload != null && payload.getType() == Payload.Type.FILE) {
                    // Retrieve the filename that was received in a bytes payload.
                    String newFilename = filePayloadFilenames.remove(update.getPayloadId());
                    java.io.File payloadFile = payload.asFile().asJavaFile();

                    // Rename the file.
                    payloadFile.renameTo(new File(payloadFile.getParentFile(), newFilename));

                }

                break;
            case PayloadTransferUpdate.Status.FAILURE:
                Log.d(TAG, "onPayloadTransferUpdate: FAILURE");
                break;
        }
    }
}; 

除了 Google 示例 walkietalkie 之外,还有可行的示例吗?

发件人

D/ShareService: sendFile: filename message -7668342386822656500:a73ecba18dc6c8506ed89c1ed47c9948.mp4

D/ShareService: onPayloadTransferUpdate(endpointId=osUc, update=com.google.android.gms.nearby.connection.PayloadTransferUpdate@e16fc0a8) D/ShareService: onPayloadTransferUpdate: 57 D/ShareService: onPayloadTransferUpdate: 1048576 D/DiscoveryActivity: onNext: ShareState{state='Sending ', stateCode=800} D/ShareService: onPayloadTransferUpdate(endpointId=osUc, update=com.google.android.gms.nearby.connection.PayloadTransferUpdate@813731ce) D/ShareService: onPayloadTransferUpdate: 1055744 D/DiscoveryActivity: onNext: ShareState{state='Sending ', stateCode=800} D/ShareService: onPayloadTransferUpdate(endpointId=osUc, update=com.google.android.gms.nearby.connection.PayloadTransferUpdate@81372a4c) 11-01 07:35:20.790 D/ShareService: onPayloadTransferUpdate: SUCCESS 11-01 07:35:41.587 D/ShareService: disconnectedFromEndpoint(endpoint=Endpoint{id=osUc, name=87389}) 11-01 07:35:41.587 D/ShareService: onEndpointDisconnected

接收者

D/ShareService: onConnectionResponse(endpointId=ABVq, result=com.google.android.gms.nearby.connection.ConnectionResolution@9edd5e3) D/ShareService: connectedToEndpoint(endpoint=Endpoint{id=ABVq, name=08043}) D/ShareService: onEndpointConnected D/ShareService: stopDiscovering D/ShareService: stopAdvertising

D/ShareService: onPayloadReceived(endpointId=ABVq, payload=com.google.android.gms.nearby.connection.Payload@516155e) D/ShareService: onPayloadReceived: Payload.Type.BYTES D/ShareService: onPayloadReceived: BYTES -7668342386822656500:a73ecba18dc6c8506ed89c1ed47c9948.mp4 D/ShareService: onPayloadTransferUpdate(endpointId=ABVq, update=com.google.android.gms.nearby.connection.PayloadTransferUpdate@ba6f47ac) D/ShareService: onPayloadTransferUpdate: 57 D/ShareService: onPayloadTransferUpdate(endpointId=ABVq, update=com.google.android.gms.nearby.connection.PayloadTransferUpdate@ba6f402a) 11-01 08:10:52.525 D/ShareService: onPayloadTransferUpdate: SUCCESS 11-01 08:11:12.355 D/ShareService: disconnectedFromEndpoint(endpoint=Endpoint{id=ABVq,name=08043}) D/ShareService: onEndpointDisconnected

onPayloadTransferUpdate:首次字符串传输成功

延迟

Payload bytePayload = outgoingPayloads.remove(update.getPayloadId());
                            if (bytePayload != null && bytePayload.getType() == Payload.Type.BYTES) {
                                if (endpnt != null && filePayload != null) {
                                    try {
                                        Thread.sleep(10000);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                    Nearby.Connections.sendPayload(mGoogleApiClient,
                                            endpnt.getId(),
                                            filePayload);
                                }
                            }

文件:///data/data/com.package.name/files/folder/a73ecba18dc6c8506ed89c1ed47c9948.mp4

来源https://github.com/salexwm/FilesExchange

最佳答案

如果您需要一个工作示例,我可以提供一个,但您几乎已经有了。一些提示:

  1. 仅在 BYTE header 完全发送后,在 onPayloadTransferUpdate(SUCCESS) 中发送 FILE 有效负载。不保证不同类型的负载的顺序。
  2. 在获得 FILE 有效负载的 onPayloadTransferUpdate(SUCCESS) 之前,请勿断开连接。如果在传输过程中断开连接,则无法完全发送。
  3. 您应该执行 Uri.parse(uri),而不是 Uri.fromFile(new File(uri))。

关于google-play-services - 附近的连接2.0简单的文件交换应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47042424/

相关文章:

google-nearby - 谷歌附近消息不能在安卓和IOS之间使用

android - 我看不到与信标相关的附近通知

android - 除非您更新谷歌播放服务,否则应用程序不会运行

android - PublisherAdView.loadAd() 抛出 SecurityException - getTasks() 需要 android.permission.GET_TASKS

android - 如何使用 Google Play 服务中的新 Barcode API 捕获条形码值?

ios - 使用附近API的iOS版DISTANCE_TYPE_EARSHOT?

android - 是否可以从手机设置中授予 Nearby API 权限?

android - 附近的连接2.0:混合使用不同的策略?

Android GPS - 向排行榜提交高分

java - 在 Android Studio 中导入 Google Play Services 库