我正在使用Nearby Connections Exchange page上的文件传输示例(“更复杂的示例”代码片段)。
我可以在Download/Nearby文件夹中的其他设备上发送和接收图像。图像被成功发送,因为如果我要更改文件名以赋予其适当的扩展名(例如.jpg),我可以在相册应用程序中打开图像。
private void processFilePayload(long payloadId) {
Payload filePayload = completedFilePayloads.get(payloadId);
String filename = filePayloadFilenames.get(payloadId);
if (filePayload != null && filename != null) {
completedFilePayloads.remove(payloadId);
filePayloadFilenames.remove(payloadId);
// Retrieve received file from Downloads folder
Payload.File payloadFile2 = filePayload.asFile();
File payloadJavaFile = payloadFile2.asJavaFile();
if (payloadJavaFile == null) {
Log.d(TAG, "Payload java file is null in processFilePayload()");
} else {
payloadJavaFile.renameTo(new File(payloadJavaFile.getParentFile(), filename));
}
}
}
为什么payloadJavaFile变量是空的?通过查看Payload.class,我知道asJavaFile()的结果是一个可以为空的文件,并且在asJavaFile() method description中,从onPayloadReceived()内部调用processFilePayload()中的asJavaFile() (如API页面上的示例所做的那样)可能会导致文件尚未接收到所有有效负载的内容。但是,在验证了PayloadTransferUpdate是否成功之后,我还从onPayloadTransferUpdate()中调用了processFilePayload(),因此有效负载不应该在这个阶段接收到它的所有内容(并且在有效负载对象上调用asJavaFile()时不是空的)?
我的代码与发送和接收图像和文件名的文档几乎相同。
发布于 2019-03-15 08:01:16
如果没有为您的应用程序正确设置READ_EXTERNAL_STORAGE权限,Payload.asJavaFile()将为null。您需要在AndroidManifest.xml中使用READ_EXTERNAL_STORAGE,并且还需要在运行时请求READ_EXTERNAL_STORAGE权限,因为这是一个危险的权限。(https://developer.android.com/training/permissions/requesting)
要使用附近的连接共享文件,您的应用程序将需要以下所有条件:
AndroidManifest.xml
<!-- Required for Nearby Connections -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Optional: needed to share files -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
MainActivity.java
ActivityCompat.requestPermissions(thisActivity,
new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_EXTERNAL_STORAGE
},
PERMISSIONS_REQUEST_CODE);
我们将改进文档,使共享文件的这一要求更加明显。
发布于 2019-01-29 16:47:57
我检查了源代码。在我看来,asJavaFile()总是被设置的(我不确定为什么它被标记为@ sure )。
不幸的是,如果我要进一步研究它,我需要你给我提供一个重现你所看到的bug的示例应用程序。
https://stackoverflow.com/questions/54376911
复制相似问题