Nearby Connections:为什么下载文件夹中的负载文件为空?
Nearby Connections: Why is the payload file from the Downloads folder null?
我正在关注 Nearby Connections Exchange page("more complex example" 代码片段)中的文件传输示例。
我可以在 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 变量为 null? 通过查看 Payload.class,我知道 asJavaFile() 的结果是一个可为 null 的文件,并且从 asJavaFile() method description,从 onPayloadReceived() 中调用 processFilePayload() 中的 asJavaFile()(如 API 页面上的示例所做的那样)可能导致文件尚未接收到所有有效负载的内容。但是,在验证 PayloadTransferUpdate 成功后,我还在 onPayloadTransferUpdate() 中调用了 processFilePayload(),因此有效负载不应该在这个阶段接收到它的所有内容(并且在有效负载上调用 asJavaFile() 时不应该为空)对象)?
我的代码与发送和接收图像和文件名的文档几乎相同。
我检查了源代码。据我所知,总是设置 asJavaFile() (我不确定为什么它被标记为 @Nullable)。
不幸的是,为了让我进一步调查它,我需要你向我提供一个示例应用程序来重现你所看到的错误。
如果未为您的应用程序正确设置 READ_EXTERNAL_STORAGE 权限,Payload.asJavaFile() 将为 null。您需要 AndroidManifest.xml 中的 READ_EXTERNAL_STORAGE 并且您还需要在运行时请求 READ_EXTERNAL_STORAGE 权限,因为它是一个危险的权限。 (https://developer.android.com/training/permissions/requesting)
要使用 Nearby Connections 共享文件,您的应用程序需要满足以下所有条件:
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);
我们将改进文档,使共享文件的这一要求更加明显。
我正在关注 Nearby Connections Exchange page("more complex example" 代码片段)中的文件传输示例。
我可以在 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 变量为 null? 通过查看 Payload.class,我知道 asJavaFile() 的结果是一个可为 null 的文件,并且从 asJavaFile() method description,从 onPayloadReceived() 中调用 processFilePayload() 中的 asJavaFile()(如 API 页面上的示例所做的那样)可能导致文件尚未接收到所有有效负载的内容。但是,在验证 PayloadTransferUpdate 成功后,我还在 onPayloadTransferUpdate() 中调用了 processFilePayload(),因此有效负载不应该在这个阶段接收到它的所有内容(并且在有效负载上调用 asJavaFile() 时不应该为空)对象)?
我的代码与发送和接收图像和文件名的文档几乎相同。
我检查了源代码。据我所知,总是设置 asJavaFile() (我不确定为什么它被标记为 @Nullable)。
不幸的是,为了让我进一步调查它,我需要你向我提供一个示例应用程序来重现你所看到的错误。
Payload.asJavaFile() 将为 null。您需要 AndroidManifest.xml 中的 READ_EXTERNAL_STORAGE 并且您还需要在运行时请求 READ_EXTERNAL_STORAGE 权限,因为它是一个危险的权限。 (https://developer.android.com/training/permissions/requesting)
要使用 Nearby Connections 共享文件,您的应用程序需要满足以下所有条件:
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);
我们将改进文档,使共享文件的这一要求更加明显。