如何读取或写入文件,因为 getExternalStorageDirectory 在 API 29 中已弃用?

2022-09-03 14:01:29

我正在学习Android开发,我遇到了一些问题来阅读java中的getExternalStorageDirectory,我已经阅读了 https://developer.android.com/reference/android/os/Environment 但无法理解,有人可以帮助我使用java中的示例代码吗?


答案 1

文档中,您可以看到:

getExternalStoragePublicDirectory(String type)

此方法在 API 级别 29 中已弃用。为了提高用户隐私,不推荐使用对共享/外部存储设备的直接访问。当应用以Build.VERSION_CODES为目标时。Q,从此方法返回的路径不再可供应用直接访问。应用可以通过迁移到 Context#getExternalFilesDir(String)、MediaStore 或 Intent#ACTION_OPEN_DOCUMENT 等替代项来继续访问存储在共享/外部存储上的内容。

将任何内容作为参数传递给此函数,以将您的目录作为对象获取:File

context.getExternalFilesDir();

这里的“上下文”是一个对象,它由this.getContext();

this是活动的当前对象。使用时请仔细检查示波器。

重要

要访问内部存储,和/或需要在文件中 AndroidManifest.xmlManifest.permission.WRITE_EXTERNAL_STORAGEManifest.permission.READ_EXTERNAL_STORAGE

可选信息:

  1. 通常,内部存储在Android设备上具有路径/sdcard/。这不是一条真正的道路,而是一个符号链接

  2. 这令人困惑,但Android中的“外部SD卡”意味着内部设备存储,而不是外部可弹出的设备外存储卡存储。另请注意,无法完全访问真正的外部SD卡

  3. 活动类扩展了 Context 类 这就是为什么我们可以从中获取上下文。


答案 2

更新

从Android 11开始,它不允许在根目录中创建文件夹/文件,但是,我们仍然可以在公共目录的帮助下管理文件夹分离(它将显示已弃用的警告,但它会起作用)

fun getAbsolutePath(context: Context): File {
    return File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "{YOUR_FOLDER_NAME}"))
}

现在,使用公共目录路径创建文件

val file = File(getAbsolutePath(requireContext()), "FILENAME.EXTENSION")

使用此静态方法。目前,我没有找到任何合法的方法来做到这一点。因此,我制作了这个静态方法来获取root或getAbsolutePath文件路径。

public static File getAbsoluteDir(Context ctx, String optionalPath) {
        String rootPath;
        if (optionalPath != null && !optionalPath.equals("")) {
            rootPath = ctx.getExternalFilesDir(optionalPath).getAbsolutePath();
        } else {
            rootPath = ctx.getExternalFilesDir(null).getAbsolutePath();
        }
        // extraPortion is extra part of file path
        String extraPortion = "Android/data/" + BuildConfig.APPLICATION_ID
                + File.separator + "files" + File.separator;
        // Remove extraPortion
        rootPath = rootPath.replace(extraPortion, "");
        return new File(rootPath);
    }

推荐