2012-11-13 2 views
16

Die meisten der neuen Android-Geräte verfügen über eine interne SD-Karte und eine externe SD-Karte. Ich möchte eine Datei-Explorer App machen, aber ich kann nicht herausfinden, wie der Weg in meine App zu nutzen zu bekommen, weilSo erhalten Sie den internen und externen SD-Kartenpfad in Android

File file = Environment.getExternalStorageDirectory(); 

kehrt gerade in den meisten Gerät /mnt/sdcard aber es gibt einen anderen Weg für die anderen externen SD-Karte wie /storage1 or /storage2 . Jede Hilfe wird geschätzt.

Antwort

0

aber es gibt einen anderen Weg für die anderen externen SD-Karte wie/storage1 oder/Storage2

gibt nichts in den Android SDK ist - zumindest durch Android 4.1 - die Sie auf diese zugreifen gibt Pfade. Möglicherweise sind sie von Ihrer App nicht lesbar oder schreibbar. Das Verhalten solcher Speicherorte und wofür sie verwendet werden, liegt bei den Geräteherstellern.

+0

Ok, aber wie kann ich wissen, ob das Gerät interne und externe sdcard by code –

+2

@ Ma7moudHatem hat: Es gibt nichts im Android SDK - zumindest durch Android 4.1 - das sagt Ihnen "wenn das Gerät intern und externe SD Karte nach Code ". – CommonsWare

+0

@MahmoudHatem für die Suche nach dem richtigen Speicherort der internen oder externen SD-Karte müssen Sie DDMS in Ihrem Android SDK verwenden. – UchihaSasuke

-1

Es gibt keine öffentliche API für den internen/externen SD-Kartenpfad.

Aber es gibt Plattform-API namens StorageManager im Paket android.os.storage. siehe http://goo.gl/QJj1eu.

Es gibt einige Features wie Listenspeicher, mount/unmount Lagerung, erhalten Zustand montieren, erhalten Speicherpfad usw.

Aber es ist versteckt api und es sollte in der nächsten Android-Version veraltet oder gebrochen werden.

Und einige Methoden benötigen spezielle Erlaubnis, und die meisten sind nicht dokumentiert.

0

diesen Code Versuchen Sie es

Map<String, File> externalLocations = ExternalStorage.getAllStorageLocations(); 
File sdCard = externalLocations.get(ExternalStorage.SD_CARD); 
File externalSdCard = externalLocations.get(ExternalStorage.EXTERNAL_SD_CARD); 
+0

LOL, vollständige Lösung ist hier: https://StackOverflow.com/A/15612964/1233659 –

1

helfen Da es keine direkte meathod die Wege zu bekommen, ist die Lösung Scannen Sie die /system/etc/vold.fstab Datei sein kann, und suchen Sie nach Zeilen wie diese: dev_mount sdcard/mnt/sdcard 1 /devices/platform/s3c-sdhci.0/mmc_host/mmc0

Wenn eine gefunden wird, spaltete es in seine Elemente und dann die Pfad zu der herausziehen, der Einhängepunkt und Fügen Sie es der Arraylist hinzu

ganz so fügen wir einen Weg hier um sicherzustellen, dass die Liste immer enthält den Pfad zum ersten sdcard, ob real oder emuliert

betonten Text einige Geräte der vold Datei fehlen.

sVold.add("/mnt/sdcard"); 

    try { 
     Scanner scanner = new Scanner(new File("/system/etc/vold.fstab")); 
     while (scanner.hasNext()) { 
      String line = scanner.nextLine(); 
      if (line.startsWith("dev_mount")) { 
       String[] lineElements = line.split(" "); 
       String element = lineElements[2]; 

       if (element.contains(":")) 
        element = element.substring(0, element.indexOf(":")); 

       if (element.contains("usb")) 
        continue; 

       // don't add the default vold path 
       // it's already in the list. 
       if (!sVold.contains(element)) 
        sVold.add(element); 
      } 
     } 
    } catch (Exception e) { 
     // swallow - don't care 
     e.printStackTrace(); 
    } 
} 

Nachdem wir nun eine gereinigte Liste der Mount-Pfade haben, testen Sie jeden sicher, dass es ein gültiger und verfügbare Pfad zu machen. Wenn nicht, entfernen Sie es aus der Liste.

private static void testAndCleanList() 
{ 
    for (int i = 0; i < sVold.size(); i++) { 
     String voldPath = sVold.get(i); 
     File path = new File(voldPath); 
     if (!path.exists() || !path.isDirectory() || !path.canWrite()) 
      sVold.remove(i--); 
    } 
} 
3

Ja. Verschiedene Hersteller verwenden unterschiedliche SD-Karten-Namen wie in Samsung Tab 3 seine extsd, und andere Samsung-Geräte verwenden SD-Karte wie dieser andere Hersteller verwenden unterschiedliche Namen.

Ich hatte die gleiche Anforderung wie Sie.Also habe ich ein Beispiel für Sie aus meinem Projekt erstellt, um diese Verbindung Android Directory chooser Beispiel, die die Androi-Dirchooser-Bibliothek verwendet. Dieses Beispiel erkennt die SD-Karte und listet alle Unterordner auf und erkennt außerdem, ob das Gerät mehr als eine SD-Karte hat.

Ein Teil des Code wie folgt aussieht Für vollständige Beispiel liest den Link Android Directory Chooser

/** 
* Returns the path to internal storage ex:- /storage/emulated/0 
* 
* @return 
*/ 
private String getInternalDirectoryPath() { 
return Environment.getExternalStorageDirectory().getAbsolutePath(); 
} 

/** 
* Returns the SDcard storage path for samsung ex:- /storage/extSdCard 
* 
* @return 
*/ 
    private String getSDcardDirectoryPath() { 
    return System.getenv("SECONDARY_STORAGE"); 
} 


mSdcardLayout.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     String sdCardPath; 
     /*** 
     * Null check because user may click on already selected buton before selecting the folder 
     * And mSelectedDir may contain some wrong path like when user confirm dialog and swith back again 
     */ 

     if (mSelectedDir != null && !mSelectedDir.getAbsolutePath().contains(System.getenv("SECONDARY_STORAGE"))) { 
      mCurrentInternalPath = mSelectedDir.getAbsolutePath(); 
     } else { 
      mCurrentInternalPath = getInternalDirectoryPath(); 
     } 
     if (mCurrentSDcardPath != null) { 
      sdCardPath = mCurrentSDcardPath; 
     } else { 
      sdCardPath = getSDcardDirectoryPath(); 
     } 
     //When there is only one SDcard 
     if (sdCardPath != null) { 
      if (!sdCardPath.contains(":")) { 
       updateButtonColor(STORAGE_EXTERNAL); 
       File dir = new File(sdCardPath); 
       changeDirectory(dir); 
      } else if (sdCardPath.contains(":")) { 
       //Multiple Sdcards show root folder and remove the Internal storage from that. 
       updateButtonColor(STORAGE_EXTERNAL); 
       File dir = new File("/storage"); 
       changeDirectory(dir); 
      } 
     } else { 
      //In some unknown scenario at least we can list the root folder 
      updateButtonColor(STORAGE_EXTERNAL); 
      File dir = new File("/storage"); 
      changeDirectory(dir); 
     } 


    } 
}); 
1

Ich bin nicht sicher, wie allgemein eine Antwort auf diese, aber ich es auf einem motorola XT830C mit Android getestet 4.4 und auf einem Nexus 7 Android 6.0.1. und auf einem Samsung SM-T530NU Android 5.0.2. Ich verwendete System.getenv("SECONDARY_STORAGE") und Environment.getExternalStorageDirectory().getAbsolutePath().
Das Nexus, das keine zweite SD-Karte hat, System.getenv gibt null zurück und Envirnoment.getExterna... gibt/storage/emuliert/0.
Das Motorola-Gerät, das eine externe SD-Karte hat, gibt/storage/sdcard1 für System.getenv("SECONDARY_STORAGE") und Envirnoment.getExterna... gibt/storage/emuliert/0.
Die samsumg gibt/storage/extSdCard für die externe SD zurück.
In meinem Fall mache ich ein Unterverzeichnis auf dem externen Standort und bin mit

appDirectory = (System.getenv("SECONDARY_STORAGE") == null) 
     ? Environment.getExternalStorageDirectory().getAbsolutePath() 
     : System.getenv("SECONDARY_STORAGE"); 

die SD-Karte zu finden. Das Erstellen eines Unterverzeichnisses in diesem Verzeichnis funktioniert.
Natürlich musste ich die Berechtigung in der Manifest-Datei setzen, um auf den externen Speicher zuzugreifen.
ich auch ein Nook 8" Farbe Tablette haben. Wenn ich eine Chance auf sie zu testen, werde ich schreiben, wenn ich mit diesem Ansatz irgendwelche Probleme haben.

6

Wie die interne und externe SD-Karte Weg zu bekommen in android

Methods in Interner Speicher zu speichern:

File getDir (String name, int mode) 

File getFilesDir() 

Above Methoden in Context Klasse vorhanden sind

Methods in internen Telefonspeicher zu speichern:

File getExternalStorageDirectory() 

File getExternalFilesDir (String type) 

File getExternalStoragePublicDirectory (String type) 

Am Anfang jeder verwendet Environment.getExternalStorageDirectory(), die von internen Telefonspeicher auf die Wurzel hingewiesen. Daher wurde das Stammverzeichnis mit zufälligem Inhalt gefüllt.

Später wurden diese beiden Methoden hinzugefügt:

In Context Klasse fügten sie hinzu getExternalFilesDir(), indem er auf ein App-spezifische Verzeichnis auf dem internen Speicher des Telefons. Dieses Verzeichnis und seine Inhalte werden gelöscht, wenn die App deinstalliert wird.

Environment.getExternalStoragePublicDirectory() für zentrale Speicherorte für bekannte Dateitypen wie Fotos und Filme. Dieses Verzeichnis und sein Inhalt werden NICHT gelöscht, wenn die App deinstalliert wird.

Methoden zum Speichern in Wechselmedien, d. H.microSD-Karte

Vor der API-Stufe 19 gab es keine offizielle Möglichkeit, auf SD-Karte zu speichern. Aber viele könnten dies mit inoffiziellen APIs tun.

Offiziell wurde eine Methode in Context Klasse in API-Ebene 19 (Android-Version 4.4 - Kitkat) eingeführt.

File[] getExternalFilesDirs (String type) 

Es gibt absolute Pfade zu anwendungsspezifische Verzeichnissen auf alle shared/externen Speichergeräte, wo die Anwendung persistente Dateien, die er besitzt platzieren können. Diese Dateien sind intern für die Anwendung und für den Benutzer normalerweise nicht als Medien sichtbar.

Das bedeutet, es wird Pfade zu Micro-SD-Karte und internen Speicher zurückgeben. Im Allgemeinen zweiten zurückgegebenen Pfad wäre Speicherpfad der Micro-SD-Karte.

Die interne und externe Speicher Terminologie nach Google/Amtlicher Android docs ist ganz anders von dem, was wir denken.

0
File main=new File(String.valueOf(Environment.getExternalStorageDirectory().getAbsolutePath())); 
File[]t=main.getParentFile().listFiles(); 

for(File dir:t) 
{ 
    Log.e("Main",dir.getAbsolutePath()); 
} 

Ausgang:

E/Main: /storage/sdcard1 
E/Main: /storage/sdcard0 

Ich habe eine SD-Karte und eingebauten Speicher.

Verwandte Themen