安卓如何使用Environment.getExternalStorageDirectory()函数

58
我该如何使用Environment.getExternalStorageDirectory()方法读取存储在SD卡中的图像?或者是否有更好的方式实现呢?
4个回答

90
Environment.getExternalStorageDirectory().getAbsolutePath()

这个方法可以给你SD卡的完整路径,然后你就可以使用标准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();

45
别忘了检查外部存储是否已挂载:Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) - whlk
1
好的评论,Mannaz!顺便问一下,你需要包含哪个库才能使用这些调用?难道是 Android.os.Environment 吗? - gonzobrains
@Mannaz,当存储未挂载时该怎么办?我需要做什么?我必须使用哪个目录来保存文件? - androidevil
@androidevil:在Android开发者文档中有一份指南,介绍如何使用存储。也许您可以向用户显示一条消息,并告诉他安装外部存储器或改用内部存储器。 - whlk
1
baseDir一直给我返回/storage/emulated/0,但这不在SD卡上。我该怎么办? - most venerable sir
它被称为外部是因为它是应用程序外部的,实际上它是设备内部存储器,而不是SD卡。 - satvik choudhary

39

请注意,getExternalStorageDirectory()在某些手机上无法正常工作,例如我的Motorola razr maxx,它有两个卡片/mnt/sdcard和/mnt/sdcard-ext - 分别用于内部和外部SD卡。你每次都会得到/mnt/sdcard的回复。Google必须提供一种处理这种情况的方法。因为这使得许多SD卡感知应用程序(即卡备份)在这些手机上失败。


我也有同样的问题,我的Galaxy Tab 2 GT-P3110也是这样...我一直在想为什么我的数据库没有复制到SD卡上,后来才意识到像你说的有两张卡...浪费了好几个小时来调试什么都没解决! - Paranoid Android
1
有些设备可能会将内部存储的一部分用作外部存储,并提供一个SD卡插槽。在这种情况下,SD卡不是外部存储的一部分,您的应用程序无法访问它(额外的存储空间仅用于系统扫描的用户提供的媒体)。 - Timuçin
@Tim,我遇到了这样的问题。Nexus 5只有内置存储,而Micromax a114 canvas 2.2具有可扩展存储。我的问题是,当我尝试从我的应用程序下载一些文件时,无法下载。而Environment.MEDIA_MOUNTED是什么意思? - Karthikeyan Ve
这个问题已经解决:android-external-storage-create-new-directory - ELITE
我的图像保存在内部存储器上,我正在使用Environment.getExternalStorageDirectory().getAbsolutePath(); - Moeez

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()我们可以在用户首选存储(通常是内部存储器)中创建新目录。那么,如果默认存储已设置为“外部存储器”,但它不可读/写,会发生什么?这会抛出异常吗?还是它会自动创建在“内部存储器”中? - S.R

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接