为什么 getExternalStoragePublicDirectory 在所有 Android 版本(最高 14)中都可以工作?

问题描述 投票:0回答:1

我创建了一个简单的应用程序,其功能是将 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 permissions storage
1个回答
0
投票

根据我的实践,即使在 Android 14 上,仍然可以访问公共下载目录,但仅限于您的应用程序文件。例如,如果您尝试覆盖另一个应用程序文件,您将收到异常。

不幸的是,文档没有提到它。

© www.soinside.com 2019 - 2024. All rights reserved.