在Android 2.x中,是否有记录的方式来检查多个SD卡中的内容?

| 某些Android 2.x平板电脑(例如HTC Flyer和Samsung Galaxy Tab)支持内部平板电脑存储和外部SD卡。例如,在我的传单上,ѭ0和ѭ1是分开的,前者代表平板电脑的“内部存储空间”。 如果我使用
Environment.getExternalStorageDirectory()
,似乎没有任何设定规则可以确定返回哪个存储位置。使用
getExternalStorageDirectory()
时,我担心的是,我只会找到存储在两个存储位置之一中的媒体。 一种解决方案是仅对应用程序进行“ 4”码硬编码扫描,但这是假设所有设备都将其用作命名方案,我认为这不是一个安全的假设。 在Android 2.x上,有没有记录的方式来扫描和使用多个SD卡/存储位置? 我的目标实际上是在平板电脑上找到所有有声读物,所以我想以某种有记载的方式查找和使用所有
/sdcard*/Audiobooks
。     
已邀请:
        通常,第二个sdcard安装在第一个sdcard中。 这是我的意思: 第一个sdcard安装在
/mnt/sdcard
。 第二个SD卡安装在mounted7中 因此,只要您收到“ 6”作为外部存储路径并开始扫描树,您就不会错过第二个sdcard(如果它也已安装)。 这是没有记录的行为。但是Galaxy Tab的行为恰恰是这种方式。我认为这是因为没有针对多个外部存储的官方Android API支持(即
Environment
类中没有特殊功能)。     
        您可以使用下面的代码获取系统中所有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()]);
}
    

要回复问题请先登录注册