Q: Как распаковать на внешнюю "Карту памяти". Android, Java Есть код:
public class Unzipper {

private static String LOG_TAG = Unzipper.class.getSimpleName();

public static void unzip(final File file, final File destination) throws ZipException, IOException {
    new Thread() {
        public void run() {
            long START_TIME = System.currentTimeMillis();
            long FINISH_TIME = 0;
            long ELAPSED_TIME = 0;
            try {
                ZipInputStream zin = new ZipInputStream(new FileInputStream(file));
                String workingDir = destination.getAbsolutePath()+"/";

                byte buffer[] = new byte[4096];
                int bytesRead;
                ZipEntry entry = null;
                while ((entry = zin.getNextEntry()) != null) {
                    if (entry.isDirectory()) {
                        File dir = new File(workingDir, entry.getName());
                        if (!dir.exists()) {
                            dir.mkdir();
                        }
                        Log.i(LOG_TAG, "[DIR] "+entry.getName());
                    } else {
                        FileOutputStream fos = new FileOutputStream(workingDir + entry.getName());
                        while ((bytesRead = zin.read(buffer)) != -1) {
                            fos.write(buffer, 0, bytesRead);
                        }
                        fos.close();
                        Log.i(LOG_TAG, "[FILE] "+entry.getName());
                    }
                }
                zin.close();

                FINISH_TIME = System.currentTimeMillis();
                ELAPSED_TIME = FINISH_TIME - START_TIME;
                Log.i(LOG_TAG, "COMPLETED in "+(ELAPSED_TIME/1000)+" seconds.");
            } catch (Exception e) {
                Log.e(LOG_TAG, "FAILED");
            }
        };
    }.start();
}

Здесь я жму на кнопку
if ( initialize() ) {
                            zipFile = new File(destination, + MyFile);
                            try {
                                Unzipper.unzip(zipFile, destination);
                            } catch (ZipException e) {
                            } catch (IOException e) {
                            }
                        } else {
                        }

И...
public boolean initialize() {
    boolean result = false;
    File sdcard = Environment.getExternalStorageDirectory();
    if ( sdcard != null ) {
        destination = sdcard;
        if ( !destination.exists() ) {
            if ( destination.mkdir() ) {
                result = true;
            }
        } else {
            result = true;
        }
    }

    return result;
}

Всё распаковывается собственно в /mnt/sdcard/
Мне же необходимо на внешнюю (вставленную) карту памяти. Причем, если прописать вручную /mnt/extSdCard, то все работает, но на других девайсах путь до карты другой /storage/sdcard0/
/mnt/MisroSD/
Универсальный бы способ, который работал бы на всех устройствах от 4.4 андроида.

A: Боюсь что тут все сложно. Во многом зависит от производителя.
Есть такое понятие как default memory - именно ее возвращает getExternalStorageDirectory(). По идее если есть и CD карта и встроенная память то default memory указывает на CD карту, а если ее вынуть, то на встроенную память. 
Но это в теории. На практике все зависит от вендора и определенно получить путь к карте памяти нельзя.
См. также эту статью и официальную документацию к getExternalStorageDirectory(), она там довольно обширная. В частности там указано что можно попробовать получить путь к вторичному хранилищу с помощью getExternalFilesDirs(String), getExternalCacheDirs() и getExternalMediaDirs().

A: Получилось у меня так:
1) Здесь я выясняю, что у нас примонтировано:
private String getSDcardPath()
{
    String exts =  Environment.getExternalStorageDirectory().getPath();
    String sdCardPath = null;
    try
    {
        FileReader fr = new FileReader(new File("/proc/mounts"));       
        BufferedReader br = new BufferedReader(fr);
        String line;
        while((line = br.readLine())!=null)
        {
            if(line.contains("secure") || line.contains("asec"))
                continue;
            if(line.contains("fat"))
            {
                String[] pars = line.split("\\s");
                if(pars.length<2)
                    continue;
                if(pars[1].equals(exts))
                    continue;
                sdCardPath =pars[1]; 
                break;
            }
        }
        fr.close();
        br.close();
        return sdCardPath;  
    }
    catch (Exception e){}
    return sdCardPath;
}

2) Так я получаю результат:
String EXTERNAL_PATH = getSDcardPath() +"/";

Результат 1: /mnt/media_rw/extSdCard/ на одном устройстве.
Результат 2: /mnt/media_rw/MicroSD/ на другом устройстве.
Но на другом устройстве карты памяти по такому пути нет, а есть: /storage/MicroSD/, так же как и на первом устройстве: /storage/extSdCard/
3) Делаю универсальность как и хотел:
String EXTERNAL_PATH = getSDcardPath() +"/";
String EXTERNAL_PATH_REPLACE = EXTERNAL_PATH.replace ("/mnt/media_rw", "/storage");

Проверено на 4 разных устройствах с root и разрешенной записью на карту памяти. 
