【问题标题】:How do I get the external storage's path?如何获取外部存储路径?
【发布时间】:2015-02-10 08:39:42
【问题描述】:

我正在尝试将文件写入我的手机。

我用Environment.getDataDirectory()知道内部存储的路径,Environment.getExternamStorageDirectory()知道外部存储的路径。

但是当我使用Environment.getExternalStorageDirectory() 作为路径时,文件是在内部存储中创建的。当我使用Environment.GetDataStorage() 作为路径时,不会创建文件。 (我不确定,但至少在资源管理器应用中找不到。)

我认为我手机的内部存储空间被视为外部存储空间。(就我而言,它有 32 GB 的存储空间)

我想知道可移动存储(例如micro SD card)的路径。我该怎么办?

【问题讨论】:

标签: android


【解决方案1】:

来自getExternalStorageDirectory()的官方文档

不要被这里的“外部”一词所迷惑。这个目录 最好将其视为媒体/共享存储。它是一个文件系统 可以容纳相对大量的数据,并且可以共享 所有应用程序(不强制执行权限)。传统上这是 SD 卡,但它也可以作为内置存储实现 不同于受保护的内部存储的设备,并且可以 作为文件系统安装在计算机上。

因此,它可能不同于设备中的内置存储。

对于您的情况,您可以使用getExternalStoragePublicDirectory(java.lang.String)

这是用户通常放置和管理自己的地方 文件

这里的路径应该是 DIRECTORY_MUSIC、DIRECTORY_PODCASTS、 DIRECTORY_RINGTONES、DIRECTORY_ALARMS、DIRECTORY_NOTIFICATIONS、 DIRECTORY_PICTURES、DIRECTORY_MOVIES、DIRECTORY_DOWNLOADS 或 目录_DCIM。不能为空。

或者,如果您希望在用户卸载您的应用时删除您的数据,您可以使用getExternalFilesDir()

因为这些文件是应用程序内部的,并且通常不作为媒体对用户可见。

getFilesDir()getExternalFilesDir() 之间也有一些区别

  1. 外部文件并不总是可用:如果用户在计算机上安装或移除外部存储,它们就会消失。有关存储状态的信息,请参阅环境 API。

  2. 这些文件没有强制执行安全措施。例如,任何持有 WRITE_EXTERNAL_STORAGE 的应用程序都可以写入这些文件。

【讨论】:

  • 我使用了getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),但是下载路径只是从/storage/emulated/0变为/storage/emulated/0/Download。(仍然是内置存储)你知道为什么吗?
  • 我想你应该看到 commonsware stackoverflow.com/a/23030038/2319390 的答案,一定要看看他的博文系列
  • 您能否详细说明这句话“外部文件并不总是可用:如果用户在计算机上安装或删除外部存储,它们会消失”?据我了解,当用户将他的设备安装到 PC 时,文件将被隐藏。但是谷歌在谈论哪种挂载模式?当我将设备连接到 PC 时,我可以看到 PC 上存储在上述路径中的所有文件。请解释上面的句子。提前致谢!
【解决方案2】:

试试这个...

static String storagestate = Environment.getExternalStorageState();



    private static FileOutputStream outStream;
    private static File imageFilepath;

    public static String saveImage(Bitmap bitmap) {
        File folder = null;

        // Check for SD card
        if (storagestate.equals(Environment.MEDIA_MOUNTED)) {
            folder = new File(Environment.getExternalStorageDirectory(),
                    "*YourStorageNameInDevice");
            if (!folder.exists()) {
                folder.mkdir();
            }
            outStream = null;

            String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
                    .format(new Date());

            // Getting filepath
            imageFilepath = new File(folder.getPath() + File.separator
                    + timestamp + ".PNG");
            try {
                outStream = new FileOutputStream(imageFilepath);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
                outStream.flush();
                outStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return imageFilepath.getAbsolutePath();
    }
}

【讨论】:

  • 是不是缺少什么(在示例代码中)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2013-05-25
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2019-11-07
相关资源
最近更新 更多