Соединения поблизости: почему файл полезной нагрузки из папки «Загрузки» не задан? - PullRequest
0 голосов
/ 26 января 2019

Я следую примеру передачи файлов на странице Nearby Connections Exchange (фрагмент кода "более сложный пример").

Я могу отправить изображение и получить его на другом устройстве в папке 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 () , вызов asJavaFile () в processFilePayload () из onPayloadReceived () (как это сделано в примере на странице API) может привести к тому, что файл еще не получит все содержимое полезной нагрузки. Однако я также вызываю processFilePayload () из onPayloadTransferUpdate () после проверки успешности PayloadTransferUpdate, и поэтому на этом этапе полезная нагрузка не должна получить все свое содержимое (и не должна быть нулевой при вызове asJavaFile () в полезной нагрузке). объект)?

Мой код практически совпадает с документацией для отправки и получения изображения и имени файла.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Payload.asJavaFile () будет иметь значение null, если разрешение READ_EXTERNAL_STORAGE неправильно настроено для вашего приложения. Вам нужно READ_EXTERNAL_STORAGE в AndroidManifest.xml, и вам также необходимо запросить разрешение 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);

Мы улучшим документацию, чтобы сделать это требование для совместного использования файлов более очевидным.

0 голосов
/ 29 января 2019

Я проверил исходный код. Из того, что я вижу, asJavaFile () всегда установлен (и я не уверен, почему он помечен как @Nullable).

К сожалению, для дальнейшего изучения, мне нужно, чтобы вы предоставили мне пример приложения, которое воспроизводит обнаруженную ошибку.

...