附近的连接:为什么“下载”文件夹中的有效负载文件为空?

时间:2019-01-26 08:45:47

标签: java android google-nearby

我正在关注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对象)?

我的代码与用于发送和接收图像和文件名的文档几乎相同。

2 个答案:

答案 0 :(得分:2)

如果未为您的应用程序正确设置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);

我们将改进文档,以使共享文件的要求更加明显。

答案 1 :(得分:1)

我检查了源代码。据我所见,总是设置asJavaFile()(而且我不确定为什么将其标记为@Nullable)。

不幸的是,对于我来说,进一步研究它,我需要您为我提供一个示例应用程序,该程序可以重现您看到的错误。