wake-up-neo.com

Bilddatei kann nicht in Android oreo Update gespeichert werden. Wie es geht?

Ich kann keine Bilddatei in Android oreo (8.0) api 26 speichern.
Der Code funktioniert einwandfrei in API Level 25 (7.0) und ich habe keine Änderungen in der Dokumentation gefunden " Android 8.0 Behavior Changes "

Hier ist mein Code

String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File myrootDir = new File(root);
if (!myrootDir.exists()) {
    myrootDir.mkdir();
}

File myDir = new File(root + "/Myimages");
if (!myDir.exists()) {
    myDir.mkdir();
}
final String fname = System.currentTimeMillis()+"myimage.png";
File file = new File(myDir, fname);
if (file.exists())
    file.delete();
try {
    FileOutputStream out = new FileOutputStream(file);
    b.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.flush();
    out.close();
}catch (Exception e){
   Log.e("MYAPP", "exception", e);
}

Ausnahme ist FileNotFoundException. Keine solche Datei oder Verzeichnis. (Aber warum nicht in Android n?) 

Java.io.FileNotFoundException: /storage/emulated/0/Pictures/Myimages/1513151272243myimage.png (No such file or directory)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at Java.io.FileOutputStream.open0(Native Method)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at Java.io.FileOutputStream.open(FileOutputStream.Java:287)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at Java.io.FileOutputStream.<init>(FileOutputStream.Java:223)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at Java.io.FileOutputStream.<init>(FileOutputStream.Java:171)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at com.package.package.DetailPage$12.run(DetailPage.Java:737)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at Android.os.Handler.handleCallback(Handler.Java:789)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at Android.os.Handler.dispatchMessage(Handler.Java:98)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at Android.os.Looper.loop(Looper.Java:164)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at Android.app.ActivityThread.main(ActivityThread.Java:6541)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at Java.lang.reflect.Method.invoke(Native Method)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at com.Android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.Java:240)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:767)
9
jomin v george

In der Tat gibt es eine geringfügige, geringfügige Änderung bei den Berechtigungen für Apps, die auf der API 26 ausgeführt werden und deren Ausrichtung es ist.

Zuvor erhielten Apps automatisch alle Berechtigungen in einer bestimmten Gruppe, wenn der Benutzer mindestens eine Berechtigung in dieser Gruppe erteilt hatte. Dies bedeutet, dass eine App, der der READ_EXTERNAL_STORAGE erteilt wurde, auch WRITE_EXTERNAL_STORAGE sofort zugeteilt bekommen hätte, unabhängig davon, ob WRITE_EXTERNAL_STORAGE explizit angefordert wurde.

Ab Oreo wurde dies für Apps, die auf API 26+ ausgerichtet sind, korrigiert. Es werden nur die explizit angeforderten Berechtigungen erteilt. Wenn der Benutzer bereits eine Berechtigung in derselben Gruppe erteilt hat, wird keine Eingabeaufforderung für die neue Berechtigung angezeigt, die jedoch noch angefordert werden muss.

Das war in diesem Fall das Problem. Wenn Ihrer App die Berechtigung READ_EXTERNAL_STORAGE auf Nougat oder niedriger erteilt wurde, haben Sie automatisch auch WRITE_EXTERNAL_STORAGE erhalten, ohne dass Sie diese speziell anfordern mussten. Wenn Sie denselben Vorgang zum Speichern von Dateien in Oreo ausführen, erhalten Sie WRITE_EXTERNAL_STORAGE nicht automatisch, sodass das Schreiben letztendlich fehlschlägt.

Fügen Sie einfach eine spezifische Anfrage für WRITE_EXTERNAL_STORAGE hinzu. Wenn der Benutzer READ_EXTERNAL_STORAGE bereits vergeben hat, wird er nicht mit einer anderen Aufforderung belästigt. Alternativ können Sie nur WRITE_EXTERNAL_STORAGE von Anfang an anfordern, was READ_EXTERNAL_STORAGE implizit einschließt, und Sie könnten sich zwei separate Anforderungen ersparen.

13
Mike M.

Ich erlebe auch das gleiche Problem und halte dieses Problem seit 2 Monaten. Ich habe bereits die Erlaubnis für WRITE_EXTERNAL_STORAGE im Manifest erteilt und auch erneut überprüft, ob es Schreibberechtigung hat. Ich denke, es ist keine Erlaubnisfrage. Denn wenn ich mit oreo teste, wird der Ordner erstellt und in dem von mir erstellten Ordner befindet sich eine beschädigte Bilddatei. Aus diesem Grund kommt es nicht in die Galerie und beim Speichern wird ein Bild zurückgegeben, das nicht erfasst wurde. Ich bekomme dieses Problem nur in Android 7.1.1 und oreo. Bis zu Android 7.0 funktioniert es einwandfrei. Ich habe mit Geräten Samsung Galaxy Note 8 und Google Pixel XL 2 überprüft. Ich verwende eine benutzerdefinierte Kamera mit GPS und unter Funktion 

public void onImageAvailable(ImageReader reader) {
                    Image image = null;
                    try {
                        image = reader.acquireLatestImage();
                        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                        byte[] bytes = new byte[buffer.capacity()];
                        buffer.get(bytes);
                        save(bytes);

zum Speichern des Image-Bytes und die Save-Funktion enthält den folgenden Code

OutputStream output = null;
                    try {
                        output = new FileOutputStream(finalFile);
                        output.write(bytes);
                    } finally {
                        if (null != output) {
                            output.close();
                        }
                    }
1
Bindu K S