wake-up-neo.com

Wie bekomme ich den internen und externen SD-Pfad in Android?

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 erstellen, kann aber nicht herausfinden, wie der Pfad in meiner App verwendet wird, weil 

File file = Environment.getExternalStorageDirectory();

es wird in den meisten Geräten /mnt/sdcard.__ nur zurückgegeben, es gibt jedoch einen anderen Pfad für die andere externe SD-Karte wie /storage1 or /storage2 . Jede Hilfe geschätzt.

18
Mahmoud Jorban

So erhalten Sie den internen und externen SD-Pfad in Android

Methoden zum Speichern im internen Speicher:

File getDir (String name, int mode)

File getFilesDir () 

Die oben genannten Methoden sind in der Klasse Context vorhanden

Methoden zum Speichern im internen Speicher des Telefons:

File getExternalStorageDirectory ()

File getExternalFilesDir (String type)

File getExternalStoragePublicDirectory (String type)

Zu Beginn benutzte jeder Environment.getExternalStorageDirectory(), was auf den root des internen Speichers des Telefons zeigte. Als Ergebnis wurde das Stammverzeichnis mit zufälligem Inhalt gefüllt.

Später wurden diese beiden Methoden hinzugefügt:

In der Klasse Context fügten sie getExternalFilesDir() hinzu und verweisen auf ein anwendungsspezifisches Verzeichnis im internen Speicher des Telefons. Dieses Verzeichnis und sein Inhalt werden gelöscht, wenn die App deinstalliert wird.

Environment.getExternalStoragePublicDirectory() für zentralisierte Orte zum Speichern bekannter Dateitypen wie Fotos und Filme. Dieses Verzeichnis und sein Inhalt werdenNICHTgelöscht, wenn die App deinstalliert wird.

Methoden zum Speichern in Wechselmedien, d. H. Micro-SD-Karte

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

Offiziell wurde eine Methode in der Klasse Context in API Level 19 (Android-Version 4.4 - KitKat) eingeführt. 

File[] getExternalFilesDirs (String type)

Es gibt absolute Pfade zu anwendungsspezifischen Verzeichnissen für alle freigegebene/externe Speichergeräte, auf denen die Anwendung platzieren kann persistente Dateien, die es besitzt. Diese Dateien sind in der Anwendung intern und normalerweise nicht als Medien für den Benutzer sichtbar.

Das heißt, es werden Pfade zur Micro-SD-Karte und zum internen Speicher zurückgegeben. Im Allgemeinen wäre der zweite zurückgegebene Pfad der Speicherpfad der Micro-SD-Karte.

Die interne und externe Speicherung Terminologie nach Google/offiziellen Android-Dokumenten unterscheidet sich ganz anders von dem, was wir denken.

9
AnV

Ja. Andere Hersteller verwenden einen anderen SD-Kartennamen wie in Samsung Tab 3, und andere Samsung-Geräte verwenden eine SD-Karte.

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

Ein Teil des Codes sieht so aus. Für ein vollständiges Beispiel finden Sie 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);
        }


    }
});
2
Shivaraj Patil

Da es keinen direkten Weg gibt, um die Pfade zu erhalten, kann die Lösung .__ sein. Scannen Sie die Datei /system/etc/vold.fstab und suchen Sie nach folgenden Zeilen: dev_mount sdcard/mnt/sdcard 1 /devices/platform/s3c-sdhci.0/mmc_Host/mmc0

Wenn einer gefunden wird, teilen Sie ihn in seine Elemente auf und ziehen Sie dann die Pfad zum Mountpunkt und fügen Sie ihn der Arrayliste hinzu

betonter Text Bei einigen Geräten fehlt die vold-Datei vollständig, sodass wir hier einen Pfad hinzufügen Um sicherzustellen, dass die Liste immer den Pfad zur ersten SD-Karte enthält, ob echt oder nachgeahmt.

    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 bereinigte Liste von Mount-Pfaden haben, testen Sie jeden, um sicherzustellen, dass es sich um einen gültigen und verfügbaren Pfad handelt. Ist dies nicht der Fall, 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--);
    }
}
1
Emel Elias

Ich bin nicht sicher, wie allgemein eine Antwort darauf ist, aber ich habe es auf einem Motorola XT830C mit Android 4.4 und einem Nexus 7 Android 6.0.1 getestet. und auf einem Samsung SM-T530NU Android 5.0.2 . Ich habe System.getenv("SECONDARY_STORAGE") und Environment.getExternalStorageDirectory().getAbsolutePath() verwendet.
.__Der Nexus, der keine zweite SD-Karte hat, gibt System.getenv null zurück und Envirnoment.getExterna... gibt/storage/emulated/0 aus.
Das Motorola-Gerät, das über eine externe SD-Karte verfügt, gibt/storage/sdcard1 für System.getenv("SECONDARY_STORAGE") und Envirnoment.getExterna... ergibt/storage/emulated/0.
Das samsumg gibt/storage/extSdCard für die externe SD zurück.
.__ In meinem Fall mache ich ein Unterverzeichnis am externen Speicherort und verwende 

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

um die SD-Karte zu finden. Das Erstellen eines Unterverzeichnisses in diesem Verzeichnis funktioniert.
Natürlich musste ich in der Manifestdatei die Berechtigung für den Zugriff auf den externen Speicher festlegen.
Ich habe auch ein Nook 8 "-Farbtablett. Wenn ich die Möglichkeit habe, sie zu testen, poste ich, wenn ich Probleme mit diesem Ansatz habe.

1
steven smith

Versuchen Sie diesen Code, es wird helfen 

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

es gibt jedoch einen anderen Pfad für die andere externe SD-Karte wie/storage1 oder/storage2

Das Android SDK enthält - zumindest über Android 4.1 - nichts, was Ihnen den Zugriff auf diese Pfade ermöglicht. Sie können ohnehin von Ihrer App nicht lesbar oder beschreibbar sein. Das Verhalten und die Verwendung solcher Speicherorte liegt bei den Geräteherstellern.

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

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

Ausgabe:

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

Ich habe eine SD-Karte und einen eingebauten Speicher.

0
kumar