未安装 sd 卡时 Environment.getExternalStorageDirectory() 是不是返回可用的数据文件夹?

Posted

技术标签:

【中文标题】未安装 sd 卡时 Environment.getExternalStorageDirectory() 是不是返回可用的数据文件夹?【英文标题】:Does Environment.getExternalStorageDirectory() returns a usable data folder when no sd card is mounted?未安装 sd 卡时 Environment.getExternalStorageDirectory() 是否返回可用的数据文件夹? 【发布时间】:2013-07-09 18:34:49 【问题描述】:

想象一个没有插入 sd 内存的 android 设备。只有它自己的内存。

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

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

【问题讨论】:

我在手机上试过了。这将返回用于数据存储的内部存储器位置。 【参考方案1】:

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);

【讨论】:

很有趣,无论如何。您不推荐它的任何确切原因?你可以解释吗? :) @Seraphim 如果我能找到它,我会在此处搜索并发布该链接。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

我无法在很多设备上试用它,但据我所知,这种方法很大程度上是“依赖于制造商的答案”。

官方应该返回不是系统一的存储。 (SDCard 或内部“焊接内存”,是对内部核心内存的补充)。

【讨论】:

以上是关于未安装 sd 卡时 Environment.getExternalStorageDirectory() 是不是返回可用的数据文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

没有 SD 卡时无法使用浏览器下载 APK 文件 [重复]

在 API 23 及更高版本中插入 SD 卡时,getExternalFilesDirs() 未在 ApplicationContext 中更新

没有 SD 卡时,ProgressDialog 不显示在 Galaxy S3 上

C语言,提取数组数据,计算得32位的结果。(keil,读SD卡时,遇到的问题)

华为手机拍照后保存不了怎么办

SD卡存储