2016-10-17 5 views
5

ich muss ein bild von der kamera auf android speichern. i verwendet, um die Schreib externe Speicher Erlaubnis in einem offenkundigen und ich diesen Code verwendenandroid mkdirs funktioniert nicht

File dir = new File(Environment.getExternalStorageDirectory(), "Test"); 
if (!dir.exists() || !dir.isDirectory()) 
    dir.mkdirs(); 

String path = dir.getAbsolutePath(); 
Log.d(TAG, path);      //log show the path 
File file = new File(dir.getAbsolutePath() + "/Pic.jpg"); 
Log.d(TAG, file.getAbsolutePath()); //again path is shown here 

outStream = new FileOutputStream(file); 
outStream.write(bytes); 
outStream.close(); 
Log.d(TAG, "onPictureTaken - wrote bytes: " + bytes.length); //fail here 
} catch (FileNotFoundException e) { 
Log.d(TAG, "not done");      //error is here (this exception is thrown) 
} catch (IOException e) { 
Log.d(TAG, "not"); 
} finally { } 

i auch mkdir versucht() anstelle von mkdirs() gleichem Ergebnis.

keine Ahnung, was im Code falsch gelaufen ist?

danke

+3

Vielleicht [Sie haben keine Laufzeitberechtigungen implementiert] (https://stackoverflow.com/questions/32635704/android-permission- doesnt-work-even-wenn-ich-habe-deklariert-es). Darüber hinaus ** keine Ausnahme ohne Protokollierung **. Fügen Sie '' 'als dritten Parameter zu Ihren' Log.d() 'Aufrufen hinzu, und verwenden Sie dann LogCat, um die mit Ihrem Absturz verbundene Java-Stack-Ablaufverfolgung zu untersuchen. – CommonsWare

+0

Können Sie uns den StackTrace zeigen? – ToYonos

+1

'if (! Dir.exists() ||! Dir.isDirectory()) dir.mkdirs();'. Schönes Beispiel für schlechten Code. Erstens, wenn es in der Tat kein Verzeichnis ist, daher wird eine Datei mkdirs diese Datei nicht in ein Verzeichnis konvertieren. Zweitens sollten Sie den Rückgabewert von mkdirs überprüfen, da dieser fehlschlagen könnte. Was es übrigens gemacht hat. – greenapps

Antwort

17

Für diejenigen, die nicht so erfahren wie ich. Ich habe dieses Problem bekämpft, habe für einige Zeit Haare verloren. Ich ziele api 21 (aus Gründen der Kompatibilität) und es funktionierte auf Lollipop, aber auf Marshmallow würde es das Verzeichnis nicht erstellen. Ich hatte die Berechtigung "uses" im Manifest, aber es würde immer noch nicht funktionieren. Anscheinend in Marshmallow, wenn Sie mit Android-Studio installieren, fragt es Sie nie, wenn Sie es erlauben sollten, es nur leise fehlschlägt, wie Sie es abgelehnt haben. Sie müssen in Einstellungen, Apps gehen, Ihre Anwendung auswählen und den Berechtigungsschalter umdrehen.

+2

Versuchen Sie es möglicherweise Arbeit stackoverflow.com/a/41221852/5488468 –

+0

@RobbyPatel danke für Dies. Es funktionierte wie ein Zauber. aber ich habe eine Frage, wenn ich 2 Erlaubnis benötige (sagen wir Speicher und Kamera). und ich benutze diesen Code, um die Erlaubnis zu überprüfen, es nach dem ersten zu überprüfen, aber nicht nach dem anderen zu prüfen. Gibt es einen Weg, das zu tun? – lallous34

+0

kann Erlaubnis in Reihe setzen? –

0

Sie haben Verzeichnis erstellt, nicht Datei. Erstellen Sie eine neue Datei mit dem folgenden Code

File file = new File(dir.getAbsolutePath() + "/Pic.jpg"); 
file.createNewFile() 
+0

Thx für die Antwort/Ich erstellte die Datei nach Ihrem Code jetzt bekomme ich die Ausnahme von IOException anstelle der Datei nicht gefunden. – lallous34

+0

Das bedeutet, dass beim Schreiben in die Datei ein Fehler aufgetreten ist. –

+0

PS: wenn ich meine Dateien auf Android durchsuchen das Verzeichnis ist nicht erstellt (ich weiß nicht, ob dies ein Teil des Problems ist) – lallous34

0

Versuchen Sie es. Stellen Sie Laufzeit Berechtigung für Marshmallow es ist perfekt funktionieren in meinem Anwendungscode:

private String getFilename(String strFileName) { 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File fileBase = new File(filepath, "Test"); 
     if (!fileBase.exists()) { 
      fileBase.mkdirs(); 
     } 
     return (file.getAbsolutePath() + "/" + strFileName + file_exts[currentFormat]); 
    } 

new File(getFilename(edt.getText().toString().trim())) 
2

IDIOT ME! Ich habe die Manifest-Erlaubnis verwendet, aber wenn ich die App am Telefon installiert habe, habe ich keine Erlaubnis für den Speicher vergeben! ... ich verstehe ein negatives über diese Frage ... aber ich hoffe, dass jemand anderes dasselbe sieht ... check your phone permission. Entschuldigung für Unannehmlichkeiten.

1

Wenn Sie auf Android M testen, sollten Sie Einstellungen> App> Berechtigung überprüfen, um zu sehen, ob die Berechtigung zum Zugriff auf Speicher gewährt wird. Das hat mich gerettet.

1

Haben Sie

setzen
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

in Ihrem AndroidManifest? Wenn Sie Android M verwenden, müssen Sie Benutzerberechtigung anfordern, um auf SD zu schreiben, sehen Sie hier eine example