当没有安装SD卡时,Environment.getExternalStorageDirectory()是否返回可用的数据文件夹?

时间:2013-07-11 13:06:36

标签: android android-external-storage

想象一下没有sd内存的Android设备。只有自己的内存。

在这种情况下,我不确定Environment.getExternalStorageDirectory()返回什么。

空或内部存储器位置对永久数据存储有效吗?

3 个答案:

答案 0 :(得分:9)

  

public static File getExternalStorageDirectory()

     

在API级别1中添加

     

获取Android外部存储目录。如果用户已在其计算机上安装此目录,已从设备中删除或发生其他一些问题,则该目录当前可能无法访问。您可以使用getExternalStorageState()确定其当前状态。

     

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

我认为设备不同。

我有三星Galaxy S3 Environment.getExternalStorageDirectory()返回sdCard0这是内部存储内存的路径。

更多信息@

http://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory()

我不会推荐以下内容。我与Commonsware讨论了这个问题,建议不要使用下面的内容。但您可以使用以下内容进行测试。

String externalpath = new String();
String internalpath = new String();

public void getExternalMounts() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process proc = runtime.exec("mount");
        InputStream is = proc.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        String line;

        BufferedReader br = new BufferedReader(isr);
        while ((line = br.readLine()) != null) {
            if (line.contains("secure")) continue;
            if (line.contains("asec")) continue;

            if (line.contains("fat")) {//external card
                String columns[] = line.split(" ");
                if (columns != null && columns.length > 1) {
                    externalpath = externalpath.concat("*" + columns[1] + "\n");
                }
            } 
            else if (line.contains("fuse")) {//internal storage
                String columns[] = line.split(" ");
                if (columns != null && columns.length > 1) {
                    internalpath = internalpath.concat(columns[1] + "\n");
                }
            }
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
    System.out.println("Path  of sd card external............"+externalpath);
    System.out.println("Path  of internal memory............"+internalpath);
}

答案 1 :(得分:3)

在手机上的cyanogenmod内核(android 4.1)上,无论是否插入SD卡,Environment.getExternalStorageDirectory() 始终都会返回内部存储空间。还有一些手机根本不支持外部SD卡(例如Google Nexus 4)。

总的来说,结果将取决于实现,您不能依赖此调用重新调整内部存储或SD卡。类似地,当SD卡不存在时的呼叫结果也将依赖于实现(即每个设备不同)。从您的应用程序的角度来看,您将其视为一个持久应用数据的地方。

答案 2 :(得分:1)

这取决于目标实际设备。 一些(如华硕Nexus 7或三星Galaxy S [1-3]将发送其内部存储文件夹。 在其他一些设备上,它可以返回null或空。

我无法在很多设备上试用它,但从我看到的情况来看,这种方法很多是“制造商相关的答案”。

正式地,它应该返回非系统一的存储。 (SDCard或内部“焊接存储器”,它是内部核心存储器的补充)。