2013-05-22 21 views
8

w Android aplikacji muszę zrobić:jak odróżnić ścieżki kart SD wewnętrznej i zewnętrznej w android

If(removable SdCard is present){ 
    String path=get the path of removable Sdcard() ; 
    //using this path we will create some files in sdcard 
} else{ 
    //display error message 
}    

W tym celu użyliśmy kodu jako:

If (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)){ 
       String path= Environment.getExternalStorageDirectory().getPath(); 
} 

Powyższy kod nie powiedzie w niektórych najnowszych telefonach z Androidem. Pomóż nam w tym.

Poniżej znajdują się szczegółowe informacje dotyczące tego, co staraliśmy:

  • w Android komórkowych posiadających OS ICS i Jellybean, dokładna ścieżka wymiennego sdcard waha się ze względu na producenta urządzenia.

Patrz tabela poniżej

Tested Devices OS version removable sdcard path internal sd path 
Samsung galaxy s2 4.0.4 /mnt/sdcard/external_sd /mnt/sdcard 
Samsung S Advance 4.1.2 /storage/extSdCard  /storage/sdcard0 
Samsung Galaxy s3 4.0.4 /mnt/extSdCard   /mnt/sdcard 
Samsung Galaxy Note 4.0.4 /mnt/sdcard/external_sd /mnt/sdcard 

Po uruchomieniu powyższego kodu w tych urządzeniach dostaliśmy.

  • Android API Environment.getExternalStorageDirectory() getPath() zwraca tylko wewnętrzna ścieżka sd

  • Także środowisko API Environment.getExternalStorageState() zwraca Environment.MEDIA_M OUNTED na powyższych urządzeniach, mimo że sdcard został usunięty.

  • Ponadto API Environment.isExternalStorageRemovable() zawsze zwraca wartość false dla powyższych urządzeń, niezależnie od tego, czy wymienny sdcard jest obecny, czy nie.

Szukaliśmy w google i próbowałem niektóre funkcje są given.It daje tylko listę ścieżek pamięci masowej, które są zamontowane na device.But doesnot wskazać, czy sdcard removale jest obecny czy nie.

Funkcja próbowałem uzyskać ścieżkę przechowywania:

private static String getMountedPaths(){ 
    String sdcardPath = ""; 
    Runtime runtime = Runtime.getRuntime(); 
    Process proc = null; 
    try { 
     proc = runtime.exec("mount"); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    InputStream is = proc.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    String line; 
    BufferedReader br = new BufferedReader(isr); 
    try { 
     while ((line = br.readLine()) != null) { 
      if (line.contains("secure")) continue; 
      if (line.contains("asec")) continue; 

      if (line.contains("fat")) {//TF card 
       String columns[] = line.split(" "); 
       if (columns != null && columns.length > 1) { 
        mount.add(columns[1]); 
        sdcardPath=columns[1]; 
       } 
      } else if (line.contains("fuse")) {//internal storage 
       String columns[] = line.split(" "); 
       if (columns != null && columns.length > 1) { 
        mount.add(columns[1]); 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return sdcardPath; 
} 

Czy istnieje jakakolwiek inna funkcja lepsze niż powyżej, aby otrzymać listę ścieżek pamięci masowej w android? również pomóc w rozwiązaniu powyższego problemu.

+0

ja też miałem podobny problem, myślę, że to najlepszy sposób, aby uzyskać ścieżkę urządzenia wewnętrznego i zewnętrznego jest jako co uczyniłeś. A co jest nie tak z powyższym? – Raghunandan

+0

sprawdź link tutaj. użyłem podobnego kodu jak powyżej http://stackoverflow.com/questions/16637935/a-safe-path-to-external-storage/16638064#16638064 – Raghunandan

+0

"Dalej API Environment.isExternalStorageRemovable() zawsze zwraca wartość false dla powyższych urządzeń czy wymienny sdcard jest obecny, czy nie. "... Co masz na myśli? – xmen

Odpowiedz

2

Aby otrzymać kartę wewnętrzną SD

String internalStorage = System.getenv("EXTERNAL_STORAGE"); 
File f_exts = new File(internalStorage); 

Aby otrzymać kartę SD numer zewnętrzny

String externalStorage = System.getenv("SECONDARY_STORAGE"); 
File f_secs = new File(externalStorage); 
+0

lub możesz odnieść ten link również http://stackoverflow.com/questions/22219312/android-open-external-storage-directorysdcard-for-storing-file ten link również –

Powiązane problemy