如何在API 29中弃用getExternalStorageDirectory来读写文件?

时间:2019-06-29 17:36:39

标签: java android androidq

我是android开发的新手,我在阅读java中的getExternalStorageDirectory时遇到了一些问题,我已经读过https://developer.android.com/reference/android/os/Environment,但听不懂,有人可以帮我提供Java示例代码。

4 个答案:

答案 0 :(得分: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.xml中需要Manifest.permission.WRITE_EXTERNAL_STORAGE和/或Manifest.permission.READ_EXTERNAL_STORAGE

可选信息:

  1. 通常内部存储器具有路径 / sdcard /在Android设备上。这不是真实的路径,而是symlink

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

  3. Activity类扩展了Context类,这就是为什么我们可以从中获取上下文的原因。

答案 1 :(得分:1)

使用getExternalFilesDir()getExternalCacheDir()getExternalMediaDirs() (有关上下文的方法)而不是Environment.getExternalStorageDirectory()

String root = mContext.getExternalFilesDir(null).getAbsolutePath();
File myDir = new File(root + "/" + mContext.getResources().getString(R.string.app_name) + "_share");
    myDir.mkdirs();

    
    

答案 2 :(得分:0)

简短回答:

String path = getContext().getExternalFilesDir(null).getAbsolutePath();

答案 3 :(得分:0)

  

使用此静态方法。   目前,我找不到任何合法的方式来做到这一点。   因此,使我成为了获取根目录或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);
    }