一些Android 2.x平板电脑,如HTC Flyer和三星Galaxy Tab,支持内置平板电脑存储和外置SD卡。例如,在我的宣传单上,/sdcard
和/sdcard2
是分开的,前者代表平板电脑的“内部存储空间”。
如果我使用Environment.getExternalStorageDirectory()
,则似乎没有任何设置规则将返回这些的存储位置。在使用getExternalStorageDirectory()
时,我担心的是我只能找到存储在两个存储位置之一的媒体。
一种解决方案是将/sdcard*
硬编码到应用程序中,但这假设所有设备都将其用作命名方案,我不认为这是一个安全的假设。
是否有记录在Android 2.x上扫描和使用多个SD卡/存储位置的方法?
我的目标实际上是在平板电脑上找到所有有声读物,所以我想以一些记录的方式找到并使用所有/sdcard*/Audiobooks
。
答案 0 :(得分:3)
通常第二张SD卡安装在第一张SD卡内。
这就是我的意思:
第一张SD卡已安装在/mnt/sdcard
。
第二张SD卡已装入/mnt/sdcard/external_sd
因此,每当您收到/mnt/sdcard
作为外部存储路径并开始扫描树时,您将不会错过第二张SD卡(如果它也已安装)。
这不是记录在案的行为。但是Galaxy Tab就是这样的。我认为这是因为没有正式的Android API支持(即Environment
类中没有特殊功能)用于多个外部存储。
答案 1 :(得分:1)
您可以使用下面的代码获取系统中所有SD-CARD的路径。 这适用于所有Android版本并返回所有存储的路径(包括模拟)。
在我的所有设备上正常运行。
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()]);
}