我正在尝试编写简单的 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
最佳答案
如果您需要一个工作示例,我可以提供一个,但您几乎已经有了。一些提示:
- 仅在 BYTE header 完全发送后,在 onPayloadTransferUpdate(SUCCESS) 中发送 FILE 有效负载。不保证不同类型的负载的顺序。
- 在获得 FILE 有效负载的 onPayloadTransferUpdate(SUCCESS) 之前,请勿断开连接。如果在传输过程中断开连接,则无法完全发送。
- 您应该执行 Uri.parse(uri),而不是 Uri.fromFile(new File(uri))。
关于google-play-services - 附近的连接2.0简单的文件交换应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47042424/