首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取Android 4.0+的外部SD卡路径?

如何获取Android 4.0+的外部SD卡路径?
EN

Stack Overflow用户
提问于 2012-07-01 17:48:07
回答 16查看 173.8K关注 0票数 94

Samsung Galaxy S3有一个安装在/mnt/extSdCard上的外部SD卡插槽。

如何通过类似于Environment.getExternalStorageDirectory()的命令获得此路径

这将返回mnt/sdcard,并且我找不到外部SD卡的接口。(或某些平板电脑上的可移动USB存储器。)

EN

回答 16

Stack Overflow用户

发布于 2013-09-18 19:29:23

我找到了更可靠的方法来获取系统中所有SD卡的路径。这在所有Android版本上都有效,并返回到所有存储的路径(包括模拟)。

在我的所有设备上都能正常工作。

附注:基于Environment类的源代码。

代码语言:javascript
复制
private static final Pattern DIR_SEPORATOR = Pattern.compile("/");

/**
 * Raturns all available SD-Cards in the system (include emulated)
 *
 * Warning: Hack! Based on Android source code of version 4.3 (API 18)
 * Because there is no standart way to get it.
 * TODO: Test on future Android versions 4.4+
 *
 * @return paths to all available SD-Cards in the system (include emulated)
 */
public static String[] getStorageDirectories()
{
    // Final set of paths
    final Set<String> rv = new HashSet<String>();
    // Primary physical SD-CARD (not emulated)
    final String rawExternalStorage = System.getenv("EXTERNAL_STORAGE");
    // All Secondary SD-CARDs (all exclude primary) separated by ":"
    final String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE");
    // Primary emulated SD-CARD
    final String rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET");
    if(TextUtils.isEmpty(rawEmulatedStorageTarget))
    {
        // Device has physical external storage; use plain paths.
        if(TextUtils.isEmpty(rawExternalStorage))
        {
            // EXTERNAL_STORAGE undefined; falling back to default.
            rv.add("/storage/sdcard0");
        }
        else
        {
            rv.add(rawExternalStorage);
        }
    }
    else
    {
        // Device has emulated storage; external storage paths should have
        // userId burned into them.
        final String rawUserId;
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
        {
            rawUserId = "";
        }
        else
        {
            final String path = Environment.getExternalStorageDirectory().getAbsolutePath();
            final String[] folders = DIR_SEPORATOR.split(path);
            final String lastFolder = folders[folders.length - 1];
            boolean isDigit = false;
            try
            {
                Integer.valueOf(lastFolder);
                isDigit = true;
            }
            catch(NumberFormatException ignored)
            {
            }
            rawUserId = isDigit ? lastFolder : "";
        }
        // /storage/emulated/0[1,2,...]
        if(TextUtils.isEmpty(rawUserId))
        {
            rv.add(rawEmulatedStorageTarget);
        }
        else
        {
            rv.add(rawEmulatedStorageTarget + File.separator + rawUserId);
        }
    }
    // Add all secondary storages
    if(!TextUtils.isEmpty(rawSecondaryStoragesStr))
    {
        // All Secondary SD-CARDs splited into array
        final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator);
        Collections.addAll(rv, rawSecondaryStorages);
    }
    return rv.toArray(new String[rv.size()]);
}
票数 54
EN

Stack Overflow用户

发布于 2014-03-21 07:13:09

好消息!在KitKat中,现在有一个公共应用程序接口,用于与这些辅助共享存储设备进行交互。

新的Context.getExternalFilesDirs()Context.getExternalCacheDirs()方法可以返回多个路径,包括主设备和辅助设备。然后,您可以遍历它们并检查Environment.getStorageState()File.getFreeSpace(),以确定存储文件的最佳位置。这些方法也可以在ContextCompat上的support-v4库中找到。

还要注意,如果您只对使用Context返回的目录感兴趣,则不再需要READ_WRITE_EXTERNAL_STORAGE权限。接下来,您将始终拥有对这些目录的读/写访问权限,而不需要额外的权限。

应用程序也可以通过终止其权限请求来继续在旧设备上工作,如下所示:

代码语言:javascript
复制
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />
票数 13
EN

Stack Overflow用户

发布于 2013-09-29 10:19:33

我做了以下操作来访问所有的外部SD卡。

通过以下方式:

代码语言:javascript
复制
File primaryExtSd=Environment.getExternalStorageDirectory();

您将获得主要外部SD的路径,然后使用以下命令:

代码语言:javascript
复制
File parentDir=new File(primaryExtSd.getParent());

您将获得主外部存储的父目录,它也是所有外部sd的父目录。现在,您可以列出所有存储并选择所需的存储。

希望它是有用的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11281010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档