Android:在下载中存储文件

Android:在下载中存储文件,android,mediastore,storage-access-framework,Android,Mediastore,Storage Access Framework,有了Android 10和作用域存储,就不可能再使用Environment.getExternalStoragePublicDirectory()。 还有多种其他选项,包括MediaStore和Storage Access Framework。 我们的电子邮件应用程序只希望将新文件附加到下载集合。我们必须在本地预处理它们,因此不能使用DownloadManager 提及 注意:尽管可以将通用文件存储在文档/文件夹或下载/文件夹(包括非媒体文件)中,但对于这些用例,最好使用存储访问框架(SAF)

有了Android 10和作用域存储,就不可能再使用
Environment.getExternalStoragePublicDirectory()
。 还有多种其他选项,包括MediaStore和Storage Access Framework。 我们的电子邮件应用程序只希望将新文件附加到下载集合。我们必须在本地预处理它们,因此不能使用DownloadManager

提及

注意:尽管可以将通用文件存储在文档/文件夹或下载/文件夹(包括非媒体文件)中,但对于这些用例,最好使用存储访问框架(SAF)

但据我所知,每次用户想要下载文件时,我们都必须提示用户,这似乎是不必要的


将文件附加到下载中的常见做法是什么?

以下是在下载文件夹中写入文件的示例:

   OutputStream out;

   ContentResolver contentResolver = getContext().getContentResolver();

   ContentValues contentValues = new ContentValues();
   contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, localPath);
   contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf");
   contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,Environment.DIRECTORY_DOWNLOADS);
   Uri uri = contentResolver.insert(MediaStore.Files.getContentUri("external"), contentValues);
   out = contentResolver.openOutputStream(uri);

无论API级别如何,您都可以将下载的文件保存到
Download
文件夹:

FileDescription file=新的FileDescription(文件名、子文件夹、mimeType);
Uri fileUri=DocumentFileCompat.createDownloadWithMediaStoreFallback(上下文,文件);
使用
fileUri
打开输出流并将数据写入其中


无论如何,
DocumentFileCompat
仅在中可用。

对于Android 10设备,只需在清单中请求旧的外部存储,您就完成了。然后它会像以前一样工作。
当用户每次想要下载文件时,我们都必须提示用户,而这似乎是不必要的。
文件?还是文件?否。让用户选择一个目录,然后您可以在其中创建任意数量的文件。一个文件,谢谢。如果他们选择了错误的目录,他们会在以后找到它吗?我们现在使用的是MediaStorage,它的下载集合。blackapps是错误的,像往常一样,没有提供任何解决方案。安卓10在访问方面一塌糊涂,安卓11试图在某种程度上纠正这一点,但情况变得更糟。您将只能读取/写入应用程序“文件空间”中的文件。在此之外需要的任何特殊权限,如备份应用程序等,都需要谷歌批准。例如,我的应用程序在尝试创建音乐播放列表或读/写mp3标记时已损坏。我做了类似的操作,但您不需要
相对路径
,它仅用于子文件夹。感谢链接,但最好的方法可能是了解SimpleStorage的功能并在此处进行解释。