web-dev-qa-db-fra.com

Impossible de sauvegarder le fichier image dans Android oreo update. Comment faire?

Je ne parviens pas à enregistrer un fichier image sous Android oreo (8.0) api 26.
Le code fonctionne parfaitement dans les API niveau 25 (7.0) et je n’ai trouvé aucun changement dans la documentation " Changements de comportement d’Android 8.0 "

Voici mon 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);
}

L'exception est FileNotFoundException, aucun fichier ou répertoire de ce type. (Mais pourquoi pas sous 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

Je suis également confronté au même problème et je suis coincé avec ce problème à partir de 2 mois. J'ai déjà donné l'autorisation pour WRITE_EXTERNAL_STORAGE dans le manifeste et vérifier de nouveau s'il dispose d'une autorisation d'écriture. Je pense que ce n'est pas une question de permission. Parce que lorsque je teste avec oreo, le dossier est créé et il y a un fichier image corrompu dans le dossier que je crée. A cause de cela, il ne vient pas à la galerie et ensuite, il me renvoie l'image non capturée. Je reçois ce problème uniquement dans Android 7.1.1 et OREO. Jusqu'à Android 7.0, il fonctionne bien. J'ai vérifié avec les appareils samsung galaxy note 8 et google pixel xl 2. J'utilise un appareil photo personnalisé avec fonction gps et inférieure 

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);

pour image byte save et la fonction save contient le code ci-dessous

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