我创建了一个简单的应用程序,其功能是将 txt(或 xlsx)文件写入下载目录。除此之外,它对共享文件夹没有兴趣。
我一直在努力解决
ActivityResultLauncher
机制,在该机制中,您请求 WRITE_EXTERNAL_STORAGE 的运行时权限。请参阅此链接:
碰巧这在 Android 13 之后不再有效(需要更细粒度的权限)。
你瞧,事实证明,下面的一段简单代码[转到消息末尾]可以将这些文件写入所有 Android 版本(模拟)的“下载”文件夹,而无需任何权限。
郑重声明,清单仍然包含此行,但即使没有它,文件仍然可以成功保存:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
我在这里缺少什么?为什么这个方法效果这么好?我在某处读到过
getExternalStoragePublicDirectory()
已弃用(不过 IDE 并未将其标记为如此)。
public void saveFile(String fileName, byte[] fileBytes) {
final File downloadsFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
if (Objects.isNull(downloadsFolder)) {
Log.e(LOG_PREFIX, "The downloads folder was null");
toaster.show(R.string.collections_fragment_lack_permission_to_write_file);
return;
}
if (!downloadsFolder.exists()) {
if (!downloadsFolder.mkdirs()) {
Log.e(LOG_PREFIX, "The downloads folder does not exist, and an attempt to create it failed");
toaster.show(R.string.collections_fragment_lack_permission_to_write_file);
return;
}
}
final File file = new File(downloadsFolder, fileName);
try {
final var fos = new FileOutputStream(file);
fos.write(fileBytes);
fos.close();
} catch (IOException e) {
Log.e(LOG_PREFIX, "Something went wrong while attempting to write to the downloads folder");
toaster.show(R.string.collections_fragment_lack_permission_to_write_file);
}
sendFileExportedNotification(fileName);
}
根据我的实践,即使在 Android 14 上,仍然可以访问公共下载目录,但仅限于您的应用程序文件。例如,如果您尝试覆盖另一个应用程序文件,您将收到异常。
不幸的是,文档没有提到它。