Android 如何使用 Environment.getExternalStorageDirectory()

Posted

技术标签:

【中文标题】Android 如何使用 Environment.getExternalStorageDirectory()【英文标题】:Android how to use Environment.getExternalStorageDirectory() 【发布时间】:2011-07-24 03:31:59 【问题描述】:

我如何使用Environment.getExternalStorageDirectory() 从 SD 卡中读取存储的图像,或者有更好的方法吗?

【问题讨论】:

【参考方案1】:

要获取目录,可以使用下面的代码:

File cacheDir = new File(Environment.getExternalStorageDirectory() + File.separator + "");

【讨论】:

【参考方案2】:

如文档Environment.getExternalStorageDirectory() 中所述:

Environment.getExternalStorageDirectory() 返回主 共享/外部存储目录。

这是一个如何使用它来读取图像的示例:

String fileName = "stored_image.jpg";
 String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
 String pathDir = baseDir + "/android/data/com.mypackage.myapplication/";

 File f = new File(pathDir + File.separator + fileName);

        if(f.exists())
          Log.d("Application", "The file " + file.getName() + " exists!";
         else
          Log.d("Application", "The file no longer exists!";
         

【讨论】:

如您所述,使用getExternalStorageDirectory(),我们可以在用户首选存储(通常是内部存储器)中创建新目录。那么,如果默认存储设置为External memory 并且它不是可读/可写,会发生什么?这会抛出异常吗?还是会自动在Internal storage创建?【参考方案3】:
Environment.getExternalStorageDirectory().getAbsolutePath()

为您提供 SDCard 的完整路径。然后,您可以使用标准 Java 执行正常的文件 I/O 操作。

下面是一个写文件的简单例子:

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName = "myFile.txt";

// Not sure if the / is on the path or not
File f = new File(baseDir + File.separator + fileName);
f.write(...);
f.flush();
f.close();

编辑:

哎呀 - 你想要一个阅读的例子......

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName = "myFile.txt";

// Not sure if the / is on the path or not
File f = new File(baseDir + File.Separator + fileName);
FileInputStream fiStream = new FileInputStream(f);

byte[] bytes;

// You might not get the whole file, lookup File I/O examples for Java
fiStream.read(bytes); 
fiStream.close();

【讨论】:

别忘了检查外部存储是否挂载:Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 好评论,曼纳兹!顺便说一句,您需要包含什么库才能使用这些调用?是Android.os.Environment吗? @Mannaz 以及未安装存储时如何继续?我需要做什么?我使用哪个目录来保存文件? @androidevil:存储使用方法中有a guide in the Android developer docs。然后,您可能可以向用户显示一条消息并通知他安装外部存储或使用内部存储。 baseDir 一直在给我 /storage/emulated/0 ,它不在 SD 卡上。我为什么要这样做?【参考方案4】:

但请记住,getExternalStorageDirectory() 在某些手机上无法正常工作,例如我的摩托罗拉 razr maxx,因为它有 2 张卡 /mnt/sdcard 和 /mnt/sdcard-ext - 分别用于内部和外部 SD 卡。您每次只会收到 /mnt/sdcard 回复。谷歌必须提供一种方法来处理这种情况。因为它使许多支持 SD 卡的应用程序(即卡备份)在这些手机上惨遭失败。

【讨论】:

与 Galaxy Tab 2 GT-P3110 相同...我想知道为什么我的数据库没有复制到 SD 卡上,我才意识到像你说的那样有 2 张卡...如何浪费数小时的调试都白费! 使用内部存储分区作为外部存储的设备也可能提供 SD 卡插槽。在这种情况下,SD 卡不是外部存储的一部分,您的应用无法访问它(额外的存储仅适用于系统扫描的用户提供的媒体)。 @Tim 我在这里面临这样的问题。在 Nexus 5 中只有内置存储,而 Micromax a114 canvas 2.2 具有可扩展存储。我的问题是当尝试从我的应用程序下载一些文件时没有下载。而 Environment.MEDIA_MOUNTED 是什么意思? 解决了android-external-storage-create-new-directory 我的图片保存在内部存储中,我使用的是Environment.getExternalStorageDirectory().getAbsolutePath();

以上是关于Android 如何使用 Environment.getExternalStorageDirectory()的主要内容,如果未能解决你的问题,请参考以下文章

Android中Environment与StatFs获取系统/SDCard存储空间大小

如何在Android中使用FFMPEG库将Youtube视频与MP4合并?

是否有理由在iOS或Android移动设备的XF代码中使用Environment.NewLine而不是 n?

Android常用记录:Environment获取路径大全

Android 中 Environment.getExternalStorageDirectory()无效

如何调用android的拍照或本地相册选取,然后再实现相片上传服务器