Как получить доступ к файлу, который был передан с помощью API Nearby Connections с Android 11, поскольку файл хранится в хранилище с областью действия Nearby?

Я пытаюсь передать файл с помощью Google Nearby Connections API. В основном я могу заставить все компоненты передачи работать так, чтобы все данные файлов были переданы, но проблема в том, что данные файлов затем сохраняются в хранилище с ограниченной областью действия, поэтому я не могу получить к ним доступ из своего приложения, чтобы иметь возможность обрабатывать эти данные в файл соответствующего типа, а затем сохраните и переименуйте по мере необходимости.

Текущий метод, который я использую, чтобы попытаться обработать полезную нагрузку,

private void processFilePayload(long payloadId) {

// BYTES and FILE could be received in any order, so we call when either the BYTES or the FILE
// payload is completely received. The file payload is considered complete only when both have
// been received.
    Payload filePayload = completedFilePayloads.get(payloadId);
    String filename = filePayloadFilenames.get(payloadId);

    if (filePayload != null && filename != null) {
        completedFilePayloads.remove(payloadId);
        filePayloadFilenames.remove(payloadId);

// Get the received file (which will be in the Downloads folder)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

              File fromPayload = filePayload.asFile().asJavaFile();
              Uri uri = Uri.fromFile(fromPayload);

              try {
              // Copy the file to a new location.
                   InputStream in = getApplicationContext().getContentResolver().openInputStream(uri);
                   copyStream(in, new FileOutputStream(new File(getApplicationContext().getCacheDir(), filename)));
                  } catch (IOException e) {
                      // Log the error.
                      Log.e("copy file", e.toString());
                  } finally {
                      // Delete the original file.
                      getApplicationContext().getContentResolver().delete(uri, null, null);
                  }

            } else  {
            File payloadFile = filePayload.asFile().asJavaFile();

            // Rename the file.
            payloadFile.renameTo(new File(payloadFile.getParentFile(), filename));
            }
        }
    }

});

Из-за ограниченного хранилища Android 11 для доступа к файлу файлы Uri необходимо использовать для создания входного потока с преобразователем содержимого для доступа к файлу.

Согласно документации Nearby, должен быть метод Payload.File.asUri, чтобы я мог использовать строку Uri payloadUri = filePayload.asFile().asUri();, но на самом деле это недоступно в API, несмотря на использование самой последней версии Nearby.

Кроме того, использование Payload.File.AsJavaFile() должно быть объявлено устаревшим в соответствии с документацией Google Nearby.

Я видел некоторые другие ответы на аналогичные проблемы, когда предлагается использовать Media.Store, но это невозможно, поскольку у файла еще нет расширения, поэтому он не отображается как какой-либо конкретный тип файла.

Примечание. Я запросил разрешения на чтение/запись внешнего хранилища как в манифесте, так и во время выполнения.


person Mark Morrison    schedule 17.03.2021    source источник
comment
Пожалуйста, приведите несколько примеров имен файлов. Если они находятся в общедоступной папке загрузки (см. комментарий в вашем коде), то почему вы предлагаете, чтобы они находились в частной папке в каталоге Android. Далее: если они действительно находятся в личной папке в каталоге Android/data, то они недоступны для хранилища мультимедиа. Пожалуйста, узнайте, где находятся ваши файлы.   -  person blackapps    schedule 17.03.2021
comment
Файлы хранятся в разделе «Загрузки поблизости» по пути к файлу /storage/emulated/0/Download/Nearby/, а затем имя файла является идентификатором полезной нагрузки, поэтому будет что-то вроде -6159828823084046368.   -  person Mark Morrison    schedule 17.03.2021
comment
Because of android 11's scoped storage to be able to access the file the files Uri needs to be used to create an input stream with a content resolver to access the file. Все не имеет ничего общего с хранилищем с ограниченной областью действия. Ваше приложение может просто попытаться перечислить файлы als в папке «Рядом» с помощью new File( "/storage/emulated/0/Download/Nearby").list(); Вы уже пробовали это? Если вы можете, вы можете использовать новый FileInputStream для чтения файлов. Отображает ли приложение «Файлы» эти файлы из ./Download/Nearby? Вы также можете запросить в MediaStore RELATIVE_PATH Download/Nearby.   -  person blackapps    schedule 17.03.2021
comment
Папка «Рядом» переименовывается в .nearby в обновлении, которое выйдет в течение следующих 2 недель. Поиск вручную является обходным путем, пока не будет обновлен SDK.   -  person Xlythe    schedule 18.03.2021


Ответы (1)


===Обновление===

Payload.asFile.asUri() доступен в com.google.android.gms:play-services-nearby:18.0.0.

============

Прости за это. Скоро мы выпустим обновление с должным образом раскрытым #asUri.

Тем временем, если вы ориентируетесь на API 29, вы можете использовать requestLegacyExternalStorage=true в качестве обходного пути. (Подробнее: https://developer.android.com/about/versions/11/privacy/storage)

person Xlythe    schedule 18.03.2021