Почему сохранение изображений больше не работает на API 29 - PullRequest
1 голос
/ 27 февраля 2020

В моем приложении пользователь может сохранять изображения из галереи pciture на локальное устройство, нажав кнопку DL.

Код работает на старых устройствах, но в API 29 он работает следующим образом: во время сохранения я попытался открыть Галерею, чтобы посмотреть, что происходит: галерея обновляется и в течение 1 секунды появляются пустые изображения и исчезает сразу после. Я заметил, что изображение было сохранено, но оно не появляется, даже в проводнике устройств.

//DEXTER HERE  
Picasso.get().load(dummyimage.getLarge()).placeholder(R.drawable.ic_img_error).error(R.drawable.ic_red).into(saveImageToDirectory);


  final Target saveImageToDirectory = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            ProgressDialog mydialog = new ProgressDialog(getActivity());
            mydialog.setMessage("saving Image to phone");
            mydialog.show();

            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());

            try {
                String fileName = "myApp_" + timeStamp + ".JPG";
                String dirName= "/myApp";
                File file = new File(requireActivity().getApplicationContext().getExternalFilesDir(null).getAbsolutePath() + dirName, fileName);

                //new File(path for the file to be saved, saving file name)
                if (!file.exists()) {
                    //check if the file already exist or if not create a new file
                    //if exist the file will be overwritten with the new image
                    File filedirectory = new File(requireActivity().getApplicationContext().getExternalFilesDir(null).getAbsolutePath()  + dirName);
                    filedirectory.mkdirs();


                }
                if (file.exists()) {
                    file.delete();
                }
                FileOutputStream ostream = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
                Toast.makeText(getActivity(), "Picture saved to Gallery" + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
                ostream.close();
                mydialog.dismiss();

                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE, "My Images");
                values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
                values.put(MediaStore.MediaColumns.RELATIVE_PATH,"/myApp");
                // API LEVEL Q: values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
                values.put("_data", file.getAbsolutePath());
                ContentResolver cr = getActivity().getContentResolver();
                cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            } catch (Exception e) {
                mydialog.dismiss();
                Log.e("file creation error", e.toString());
            }

        }

        @Override
        public void onBitmapFailed(Exception e, Drawable errorDrawable) {
        }
        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
        }
    };

Как видите, вместо

File filedirectory = new File(Environment.getExternalStorageDirectory() + dirName);

I ' Я уже использую

File filedirectory = new File(requireActivity().getApplicationContext().getExternalFilesDir(null).getAbsolutePath()  + dirName);

Я надеюсь, что это не должно быть проблемой, но я немного застрял на этом странном поведении.

Это ошибка, из которой я выхожу my Logcat:

E / ошибка создания файла: java .lang.IllegalArgumentException: первичный каталог (недопустимый) недопустим для содержимого: // media / external / images / media; разрешенные каталоги: [DCIM, изображения]

PS: я использую Dexter, чтобы избежать проблем с разрешениями

...