Я пытаюсь передать файл с помощью 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, но это невозможно, поскольку у файла еще нет расширения, поэтому он не отображается как какой-либо конкретный тип файла.
Примечание. Я запросил разрешения на чтение/запись внешнего хранилища как в манифесте, так и во время выполнения.
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