附近的连接:为什么Downloads文件夹中的有效内容文件为空?

问题描述 投票:0回答:2

我正在关注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变量为null?通过查看Payload.class,我知道asJavaFile()的结果是一个可以为空的文件,并且从asJavaFile() method description,在onPayloadReceived()中调用processFilePayload()中的asJavaFile()(就像在API上的示例中所做的那样)页面)可能导致文件尚未收到所有有效载荷的内容。但是,在验证PayloadTransferUpdate成功之后,我还从onPayloadTransferUpdate()中调用processFilePayload(),因此有效载荷不应该在此阶段接收到所有内容(并且在有效载荷上调用asJavaFile()时不应为null宾语)?

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

java android google-nearby
2个回答
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"/>

main activity.Java

ActivityCompat.requestPermissions(thisActivity,
                new String[]{               
                  Manifest.permission.ACCESS_COARSE_LOCATION,
                  Manifest.permission.READ_EXTERNAL_STORAGE
                },
                PERMISSIONS_REQUEST_CODE);

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


1
投票

我检查了源代码。从我所看到的,asJavaFile()始终设置(我不确定为什么它被标记为@Nullable)。

不幸的是,对于我进一步调查,我需要你提供一个示例应用程序来重现你所看到的错误。

© www.soinside.com 2019 - 2024. All rights reserved.