Das Samsung Galaxy S3 verfügt über einen externen SD-Kartensteckplatz, an den montiert werden kann /mnt/extSdCard
.
Wie kann ich diesen Weg durch so etwas bekommen Environment.getExternalStorageDirectory()
?
Dies wird zurückkehren mnt/sdcard
und ich kann die API für die externe SD-Karte nicht finden. (Oder austauschbarer USB-Speicher auf einigen Tablets.)
android
android-sdcard
Romulus Urakagi Ts'ai
quelle
quelle
Antworten:
Ich habe eine Variation einer Lösung, die ich hier gefunden habe
Die ursprüngliche Methode wurde getestet und bearbeitet
Ich bin nicht sicher, auf welcher Android-Version diese waren, als sie getestet wurden.
Ich habe meine modifizierte Version mit getestet
und einige einzelne Speichergeräte, die eine SD-Karte als Hauptspeicher verwenden
Mit Ausnahme des Unglaublichen haben alle diese Geräte nur ihren Wechselspeicher zurückgegeben. Es gibt wahrscheinlich einige zusätzliche Überprüfungen, die ich durchführen sollte, aber dies ist zumindest ein bisschen besser als jede Lösung, die ich bisher gefunden habe.
quelle
Ich habe einen zuverlässigeren Weg gefunden, um Pfade zu allen SD-CARDs im System zu erhalten. Dies funktioniert auf allen Android-Versionen und gibt Pfade zu allen Speichern zurück (einschließlich emuliert).
Funktioniert auf allen meinen Geräten ordnungsgemäß.
PS: Basierend auf dem Quellcode der Umgebungsklasse.
quelle
Pattern
für/
System.getenv("SECONDARY_STORAGE")
zurückgegeben wird/storage/sdcard1
. Dieser Speicherort ist nicht vorhanden, der tatsächliche Speicherort jedoch/storage/42CE-FD0A
, wobei 42CE-FD0A die Volume-Seriennummer der formatierten Partition ist.Ich denke, um die externe SD-Karte zu verwenden, benötigen Sie diese:
ODER
in deinem Fall...
als Ersatz für
Environment.getExternalStorageDirectory()
Funktioniert bei mir. Sie sollten zuerst überprüfen, was sich im Verzeichnis mnt befindet, und von dort aus arbeiten.
Sie sollten eine Auswahlmethode verwenden, um die zu verwendende SD-Karte auszuwählen:
quelle
Um alle externen Speicher abzurufen (unabhängig davon, ob es sich um SD-Karten oder interne nicht entfernbare Speicher handelt ), können Sie den folgenden Code verwenden:
Alternativ können Sie System.getenv ("EXTERNAL_STORAGE") verwenden , um das primäre externe Speicherverzeichnis (z. B. "/ storage / sdcard0" ) abzurufen, und System.getenv ("SECONDARY_STORAGE") , um die Liste aller sekundären Verzeichnisse (z. B. " / storage / extSdCard: / storage / UsbDriveA: / storage / UsbDriveB " ). Denken Sie daran, dass Sie auch in diesem Fall die Liste der sekundären Verzeichnisse filtern möchten, um die USB-Laufwerke auszuschließen.
Bitte beachten Sie in jedem Fall, dass die Verwendung fest codierter Pfade immer ein schlechter Ansatz ist (insbesondere, wenn jeder Hersteller dies nach Belieben ändern kann).
quelle
Ich habe die Lösung von Dmitriy Lozenko verwendet , bis ich ein Asus Zenfone2 , Marshmallow 6.0.1, überprüft habe und die Lösung nicht funktioniert. Die Lösung schlug fehl, als EMULATED_STORAGE_TARGET speziell für den microSD-Pfad abgerufen wurde, dh: / storage / F99C-10F4 / . Ich habe den Code bearbeitet, um die emulierten Stammpfade direkt von emulierten Anwendungspfaden mit
context.getExternalFilesDirs(null);
abzurufen und bekanntere telefonmodellspezifische physische Pfade hinzuzufügen .Um unser Leben leichter zu machen, habe ich hier eine Bibliothek erstellt . Sie können es über das Build-System gradle, maven, sbt und leiningen verwenden.
Wenn Sie die altmodische Methode mögen, können Sie die Datei auch direkt von hier aus kopieren und einfügen. Sie werden jedoch nicht wissen, ob es in Zukunft ein Update gibt, ohne es manuell zu überprüfen.
Wenn Sie Fragen oder Anregungen haben, lassen Sie es mich bitte wissen
quelle
context.getExternalFilesDirs(null)
wirdnull
für eine der Dateien zurückgegeben, und in der folgenden Schleife tritt eine Ausnahme auf. Ich schlage vor,if (file == null) continue;
als erste Zeile in der Schleife hinzuzufügen .Gute Nachrichten! In KitKat gibt es jetzt eine öffentliche API für die Interaktion mit diesen sekundären gemeinsam genutzten Speichergeräten.
Die Methoden new
Context.getExternalFilesDirs()
undContext.getExternalCacheDirs()
können mehrere Pfade zurückgeben, einschließlich primärer und sekundärer Geräte. Sie können sie dann durchlaufen und überprüfenEnvironment.getStorageState()
undFile.getFreeSpace()
den besten Speicherort für Ihre Dateien ermitteln. Diese Methoden sind auchContextCompat
in der support-v4-Bibliothek verfügbar .Beachten Sie außerdem, dass Sie
Context
die BerechtigungenREAD_
oder nicht mehr benötigen , wenn Sie nur die von zurückgegebenen Verzeichnisse verwendenWRITE_EXTERNAL_STORAGE
möchten. In Zukunft haben Sie immer Lese- / Schreibzugriff auf diese Verzeichnisse, ohne dass zusätzliche Berechtigungen erforderlich sind.Apps können auch auf älteren Geräten weiterarbeiten, indem sie ihre Berechtigungsanforderung wie folgt beenden:
quelle
Ich habe Folgendes getan, um Zugang zu allen externen SD-Karten zu erhalten.
Mit:
Sie erhalten den Pfad zur primären externen SD. Dann mit:
Sie erhalten das übergeordnete Verzeichnis des primären externen Speichers und es ist auch das übergeordnete Verzeichnis aller externen SDs. Jetzt können Sie den gesamten Speicher auflisten und den gewünschten auswählen.
Hoffe es ist nützlich.
quelle
So erhalte ich die Liste der SD-Kartenpfade (ohne den primären externen Speicher):
quelle
externalCacheDirs[0].getParentFile().getParentFile().getParentFile().getParentFile().getAbsolutePath()
Dies ist ein Rezept für eine Katastrophe. Wenn Sie dies tun, können Sie den gewünschten Pfad genauso gut hart codieren, da Sie eine NullPointerException oder den falschen Pfad erhalten, wenn Sie ein Cache-Verzeichnis mit etwas anderem als 4 übergeordneten Elementen erhalten.Vielen Dank für die Hinweise von euch, insbesondere @SmartLemon, ich habe die Lösung bekommen. Falls jemand anderes es braucht, stelle ich hier meine endgültige Lösung ein (um die erste aufgeführte externe SD-Karte zu finden):
Wenn dort keine externe SD-Karte vorhanden ist, wird der integrierte Speicher zurückgegeben. Ich werde es verwenden, wenn die SD-Karte nicht vorhanden ist. Möglicherweise müssen Sie sie ändern.
quelle
Beziehen Sie sich auf meinen Code, hoffe hilfreich für Sie:
quelle
Tatsächlich wird bei einigen Geräten der Standardname der externen SD-Karte so angezeigt, wie
extSdCard
bei anderensdcard1
.Mit diesem Code-Snippet können Sie den genauen Pfad ermitteln und den Pfad des externen Geräts abrufen.
quelle
Ja. Unterschiedliche Hersteller verwenden unterschiedliche SD-Kartennamen wie in Samsung Tab 3, und andere Samsung-Geräte verwenden SD-Karten wie diese. Unterschiedliche Hersteller verwenden unterschiedliche Namen.
Ich hatte die gleichen Anforderungen wie Sie. Deshalb habe ich aus meinem Projekt ein Beispielbeispiel für Sie erstellt. Gehen Sie zu diesem Link. Beispiel für eine Android-Verzeichnisauswahl , das die androi-dirchooser-Bibliothek verwendet. In diesem Beispiel wird die SD-Karte erkannt und alle Unterordner aufgelistet. Außerdem wird festgestellt, ob das Gerät mehr als eine SD-Karte hat.
Ein Teil des Codes sieht folgendermaßen aus. Ein vollständiges Beispiel finden Sie unter dem Link Android Directory Chooser
quelle
Diese Lösung (zusammengestellt aus anderen Antworten auf diese Frage) behandelt die Tatsache (wie von @ono erwähnt),
System.getenv("SECONDARY_STORAGE")
die bei Marshmallow keinen Nutzen hat.Getestet und bearbeitet an:
Samsung Galaxy Tab A (Android 6.0.1 - Lager)
quelle
rawSecondaryStoragesStr.contains(path)
kann ermöglichen, dass der interne Speicher auch hinzugefügt wird. Wir können diesen Zustand besser beseitigen. Ich war mit diesem Problem konfrontiert, da mein Gerät das interne Speicherverzeichnis mitSystem.getenv("SECONDARY_STORAGE")
zurückgibt, aber den Pfad der externen Speicherkarte mitSystem.getenv(EXTERNAL_STORAGE)
auf KitKat zurückgibt . Es scheint, dass verschiedene Anbieter dies ohne verdammten Standard unterschiedlich implementiert hatten.Auf einigen Geräten (zum Beispiel Samsung Galaxy SII) kann die interne Speicherkarte in VFAT sein. In diesem Fall verwenden wir den letzten Code. Wir erhalten eine interne Speicherkarte (/ mnt / sdcad), aber keine externe Karte. Code siehe unten lösen dieses Problem.
quelle
quelle
Ich bin sicher, dass dieser Code sicherlich Ihre Probleme lösen wird ... Das funktioniert gut für mich ... \
quelle
das ist nicht wahr. / mnt / sdcard / external_sd kann auch dann vorhanden sein, wenn die SD-Karte nicht gemountet ist. Ihre Anwendung stürzt ab, wenn Sie versuchen, in / mnt / sdcard / external_sd zu schreiben, wenn sie nicht gemountet ist.
Sie müssen überprüfen, ob die SD-Karte zuerst eingelegt ist, indem Sie Folgendes verwenden:
quelle
getExternalStorageState()
der interne Speicher anstelle der externen SD-Karte zurückgegeben wird, denke ich.quelle
Sie können Folgendes verwenden: Context.getExternalCacheDirs () oder Context.getExternalFilesDirs () oder Context.getObbDirs (). Sie geben anwendungsspezifische Verzeichnisse in allen externen Speichergeräten an, in denen die Anwendung ihre Dateien speichern kann.
Mit so etwas wie Context.getExternalCacheDirs () [i] .getParentFile (). GetParentFile (). GetParentFile (). GetParent () können Sie den Stammpfad externer Speichergeräte ermitteln.
Ich weiß, dass diese Befehle für einen anderen Zweck bestimmt sind, aber andere Antworten haben bei mir nicht funktioniert.
Dieser Link gab mir gute Hinweise - https://possiblemobile.com/2014/03/android-external-storage/
quelle
System.getenv("SECONDARY_STORAGE")
Gibt für Marshmallow null zurück. Dies ist eine weitere Möglichkeit, alle externen Verzeichnisse zu finden. Sie können überprüfen, ob es entfernbar ist, um festzustellen, ob es intern / extern istquelle
Ich habe die Lösungen von Dmitriy Lozenko und Gnathonic auf meinem Samsung Galaxy Tab S2 (Modell: T819Y) ausprobiert, aber keine hat mir geholfen, den Pfad zu einem externen SD-Kartenverzeichnis abzurufen.
mount
Die Befehlsausführung enthielt den erforderlichen Pfad zum externen SD-Kartenverzeichnis (dh / Storage / A5F9-15F4) , stimmte jedoch nicht mit dem regulären Ausdruck überein und wurde daher nicht zurückgegeben. Ich verstehe den Verzeichnisbenennungsmechanismus nicht, gefolgt von Samsung. Warum sie von Standards abweichen (dh extsdcard) und sich etwas wirklich faul einfallen lassen, wie in meinem Fall (dh / Storage / A5F9-15F4) . Fehlt mir etwas? Wie auch immer, nach Änderungen im regulären Ausdruck von Gnathonic Die Lösung hat mir geholfen, ein gültiges SD-Kartenverzeichnis zu erhalten:Ich bin nicht sicher, ob dies eine gültige Lösung ist und ob sie Ergebnisse für andere Samsung-Tablets liefert, aber es hat mein Problem vorerst behoben. Im Folgenden finden Sie eine weitere Methode zum Abrufen des Pfads für austauschbare SD-Karten in Android (Version 6.0). Ich habe die Methode mit Android Marshmallow getestet und es funktioniert. Der darin verwendete Ansatz ist sehr einfach und wird sicherlich auch für andere Versionen funktionieren, aber das Testen ist obligatorisch. Einige Einblicke werden hilfreich sein:
Bitte teilen Sie uns mit, wenn Sie einen anderen Ansatz zur Behebung dieses Problems haben. Vielen Dank
quelle
Dadurch wird der Pfad des externen SD-Sekundärspeichers abgerufen.
quelle
quelle
Um auf Dateien auf meiner SD-Karte auf meinem HTC One X (Android) zuzugreifen , verwende ich diesen Pfad:
Beachten Sie die Dreifach "/"!
quelle
Unter Galaxy S3 Android 4.3 ist der Pfad, den ich verwende, ./storage/extSdCard/Card/ und er erledigt den Job. Ich hoffe es hilft,
quelle
Die folgenden Schritte haben bei mir funktioniert. Sie müssen nur diese Zeilen schreiben:
Die erste Zeile gibt den Namen des SD-Verzeichnisses an, und Sie müssen ihn nur in der Ersetzungsmethode für die zweite Zeichenfolge verwenden. Die zweite Zeichenfolge enthält den Pfad für die interne und entfernbare SD (/ storage / in meinem Fall) . Ich brauchte diesen Pfad nur für meine App, aber Sie können weiter gehen, wenn Sie ihn brauchen.
quelle