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



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

但我一直在传输File有效载荷第二个sendPayload,onPayloadTransferUpdate只在发送端调用。发现、广告、连接到端点,一切都很好。发送方正在"发送",但Reciver只获得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;
}
}
}; 

除了谷歌示例对讲机之外,还有一个工作示例吗?

发件人

D/ShareService:sendFile:filename消息-768342386822656500:a73ecba18dc6c8506ed89c1ed47c9948.mp4

D/ShareService:onPayloadTransferUpdate(endpointId=osUc,更新=com.google.android.gms.nearby.connection.PayloadTransferUpdate@e16fc0a8)D/ShareService:onPayloadTransferUpdate:57D/ShareService:onPayloadTransferUpdate:1048576D/DiscoveryActivity:onNext:ShareState{state='Sending',stateCode=800}D/ShareService:onPayloadTransferUpdate(endpointId=osUc,更新=com.google.android.gms.nearby.connection.PayloadTransferUpdate@813731ce)D/ShareService:onPayloadTransferUpdate:1055744D/DiscoveryActivity:onNext:ShareState{state='Sending',stateCode=800}D/ShareService:onPayloadTransferUpdate(endpointId=osUc,更新=com.google.android.gms.nearby.connection.PayloadTransferUpdate@81372a4c)11-01 07:35:20.790 D/ShareService:onPayloadTransferUpdate:成功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:onEndpointConnectedD/ShareService:stopDiscoveryD/ShareService:停止广告

D/ShareService:onPayloadReceived(endpointId=ABVq,有效载荷=com.google.android.gms.nearby.connection.Payload@516155e)D/ShareService:onPayloadReceived:Payload.Type.BYTESD/ShareService:onPayloadReceived:BYTES-768342386822656500:a73ecba18dc6c8506ed89c1ed47c9948.mp4D/ShareService:onPayloadTransferUpdate(endpointId=ABVq,更新=com.google.android.gms.nearby.connection.PayloadTransferUpdate@ba6f47ac)D/ShareService:onPayloadTransferUpdate:57D/ShareService:onPayloadTransferUpdate(endpointId=ABVq,更新=com.google.android.gms.nearby.connection.PayloadTransferUpdate@ba6f402a)11-01 08:10:52.525 D/ShareService:onPayloadTransferUpdate:成功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);
}
}

file:///data/data/com.package.name/files/folder/a73ecba18dc6c8506ed89c1ed47c9948.mp4

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

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

  1. 只有在BYTE标头完全发送后,才在onPayloadTransferUpdate(SUCCESS)中发送FILE有效负载。不同类型的有效载荷不能保证订单
  2. 在获得FILE负载的onPayloadTransferUpdate(SUCCESS)之前,不要断开连接。如果在传输过程中断开连接,它不会完全发送
  3. 您应该执行Uri.parse(Uri),而不是Uri.fromFile(新文件(Uri))

最新更新