Samsung Galaxy S3有一个安装在/mnt/extSdCard
上的外部SD卡插槽。
如何通过类似于Environment.getExternalStorageDirectory()
的命令获得此路径
这将返回mnt/sdcard
,并且我找不到外部SD卡的接口。(或某些平板电脑上的可移动USB存储器。)
发布于 2013-09-18 19:29:23
我找到了更可靠的方法来获取系统中所有SD卡的路径。这在所有Android版本上都有效,并返回到所有存储的路径(包括模拟)。
在我的所有设备上都能正常工作。
附注:基于Environment类的源代码。
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()]);
}
发布于 2014-03-21 07:13:09
好消息!在KitKat中,现在有一个公共应用程序接口,用于与这些辅助共享存储设备进行交互。
新的Context.getExternalFilesDirs()
和Context.getExternalCacheDirs()
方法可以返回多个路径,包括主设备和辅助设备。然后,您可以遍历它们并检查Environment.getStorageState()
和File.getFreeSpace()
,以确定存储文件的最佳位置。这些方法也可以在ContextCompat
上的support-v4库中找到。
还要注意,如果您只对使用Context
返回的目录感兴趣,则不再需要READ_
或WRITE_EXTERNAL_STORAGE
权限。接下来,您将始终拥有对这些目录的读/写访问权限,而不需要额外的权限。
应用程序也可以通过终止其权限请求来继续在旧设备上工作,如下所示:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
发布于 2013-09-29 10:19:33
我做了以下操作来访问所有的外部SD卡。
通过以下方式:
File primaryExtSd=Environment.getExternalStorageDirectory();
您将获得主要外部SD的路径,然后使用以下命令:
File parentDir=new File(primaryExtSd.getParent());
您将获得主外部存储的父目录,它也是所有外部sd的父目录。现在,您可以列出所有存储并选择所需的存储。
希望它是有用的。
https://stackoverflow.com/questions/11281010
复制相似问题