我正在关注Nearby Connections Exchange page上的文件传输示例(“更复杂的示例”代码段)。
我可以在“下载/附近”文件夹中的另一台设备上发送并接收图像。图片发送成功,因为如果我要更改文件名以提供适当的扩展名(例如.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调用asJavaFile onPayloadReceived()中的processFilePayload()中的()(如API页面上的示例中所做的那样)可能导致File尚未接收到所有有效内容。但是,在验证PayloadTransferUpdate成功之后,我也从onPayloadTransferUpdate()内调用processFilePayload(),因此有效负载在此阶段不应该已经收到其所有内容(在有效负载上调用asJavaFile()时不能为null对象)?
我的代码与用于发送和接收图像和文件名的文档几乎相同。
答案 0 :(得分:2)
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);
我们将改进文档,以使共享文件的要求更加明显。
答案 1 :(得分:1)
我检查了源代码。据我所见,总是设置asJavaFile()(而且我不确定为什么将其标记为@Nullable)。
不幸的是,对于我来说,进一步研究它,我需要您为我提供一个示例应用程序,该程序可以重现您看到的错误。