-1

Seit Android 6.0 ist der sdcard Pfad nicht mehr "/ storage/sdcard1 /", "/ storage/sdcard-ext /" oder etwas.Konnte die sdcard Datei (nicht harten Code) in Android 6.0 nicht finden

Der Pfad hängt vom Telefon ab. Wenn ich Nexus 5x AVD verwende, lautet der Pfad "/ storage/1D15-3A1B /". Wenn ich Nexus 6p AVD verwende, lautet der Pfad "/ storage/4679-1802 /". Also, wie kann ich dynamisch den SDCard-Pfad im Programm schreiben, um die Datei in externen SD-Karte zu finden?

Vielen Dank!

+3

Ist nicht Environment.getExternalStorageDirectory(). GetAbsolutePath(); funktioniert mehr? – Frame91

+3

@ Frame91 ist richtig. Sie sollten nie einen dieser Pfade benutzt haben, es war IMMER vom Telefon abhängig. Dies sind nicht einmal die häufigsten Pfade vor 6.0, wenn Sie diejenigen verwenden, die auf den meisten Geräten fehlgeschlagen sind. –

+1

Verlassen Sie sich nie auf fest codierte Pfade! –

Antwort

0

Werfen Sie einen Blick auf getExternalFilesDirs().

+0

Vielen Dank für Ihre Antwort. Ich habe diese Funktion untersucht. Aber es kehrt immer noch zum "emulierten" Pfad zurück ... –

+0

Es wird ein Array von Pfaden zurückgeben. Der zweite Punkt ist der Pfad zur SD-Karte. Es ist wirklich ... FilesDirs nicht ... FilesDir. – greenapps

+0

Ich habe gerade diesen Kommentar gelesen. Yeah, 'getExternalFilesDirs()' ist viel einfacher, das zu tun ...Ich verwechselte stattdessen 'getExternalFilesDir()'! @greenapps –

0

Es scheint, dass ich die Lösung gefunden habe.

Ich verwende das Access-Storage-Framework. Ich bekomme es, indem ich die uri-Zeichenfolge behandle und den "1D15-3A1B" -Teil erhalte und ihn dann mit dem sdcard-Pfad kombiniere. Hier ist die Lösung.

  1. Wenn ich die Datei Welcome to Word.docx in dem SD-Karte Root-Pfad klicken, erhalte ich die intent von onActivityResult().
  2. Holen Sie sich die DocumentId von String docId = DocumentsContract.getDocumentId(intent.getData()), also die Zeichenfolge docId ist "1D15-3A1B:Welcome to Word.docx". die Zeichenfolge
  3. Split und von String[] split = docId.split(":") eine String-Array erhalten, so können wir "1D15-3A1B" bekommen, die split[0] ist, und der Weg in sdcard "Welcome to Word.docx" ist split[1].
  4. Wenn wir das uri der Datei, die wir zuvor geklickt haben, abrufen möchten, müssen Sie nur eine neue Zeichenfolge erstellen String newPath = "/storage/" + split[0] + "/" + split[1].

Update: Eigentlich getExternalFilesDirs() ist viel einfacher, dies zu tun ... Danke @greenapps!

+0

Bitte zeigen Sie, wie und was Sie getan haben. – greenapps

+0

@greenapps sry Ich bin neu hier ... Ich werde die Lösung jetzt bearbeiten. –

+0

Wenn Sie mit einem Dateiexplorer in/storage gesucht hätten, hätten Sie es gesehen. – greenapps

0

ich viele Ansätze versucht, darunter:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
Environment.getExternalStorageDirectory() 

Noch meine Bilddateien in DCIM/Kamera war meinen App nicht sichtbar. Ich konnte die Verzeichnisnamen sehen, aber listFiles() in einem dieser Verzeichnisse gab null zurück. Schließlich, und verlegen, fand ich, dass mein Manifest nicht die magische Linie android.permission.WRITE_EXTERNAL_STORAGE enthielt. Sobald ich die Erlaubnis hinzugefügt hatte, funktionierte es wie ein Charme.

Moral der Geschichte: Android warnt nicht/brechen/werfen Ausnahme unter dieser Bedingung. Wenn es fehlschlägt, schlägt es still!