Сбои приложения при сохранении растрового изображения на Andorid 10, даже если для Target Sdk установлено значение 28? - PullRequest
0 голосов
/ 21 октября 2019

Я присоединяю растровое изображение к ImageView, сохраняя в MediaStore. Работает нормально на всех устройствах ниже android 10, но при сбое происходило в пикселях. Мой идентификатор Android ориентирован на SDK 28

try {
                Bitmap thePic = MediaStore.Images.Media.GetBitmap(ContentResolver, croppedPicUri);
                if(thePic != null){
                    imgProfileIcon.SetImageBitmap(thePic);

                //mediaStorageDir = Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDcim);
                mediaStorageDir = GetExternalFilesDir(Environment.DirectoryPictures);
                if (!mediaStorageDir.Exists())
                {
                    mediaStorageDir.Mkdirs();
                }


                // Create a media file name
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").Format(new Java.Util.Date());
                sendFile = new File(mediaStorageDir.Path + File.Separator + "IMG_" + timeStamp + ".png");

                String path_ = MediaStore.Images.Media.InsertImage(this.ContentResolver, thePic, "Title", null);
                if (path_ != null){
                    Uri tempUri = Uri.Parse(path_);
                    path = GetPathToImage(tempUri);
                }
                }
            } catch (Exception ex) {
                Toast.MakeText(this, "Bundle extras : " + ex.Message, ToastLength.Short).Show();
            }

{Java.Lang.IllegalStateException: Не удалось создать уникальный файл: / storage / emulated / 0 / Pictures Title image / jpeg в Java.Interop.JniEnvironment + StaticMethods. CallStaticObjectMethod (тип Java.Interop.JniObjectReference, метод Java.Interop.JniMethodInfo, Java.Interop.JniArgumentValue * args) [0x00069] в <205bc242eb64455b94479843fc.Interop.JniArgumentValue * параметры) [0x00018] в <205bc242eb64455b94479843fca3eeb7>: 0 на Android.Provider.MediaStore + Images + Media.InsertImage (Android.Content.ContentResolver cr, источник Android.Graphics.Bitmap, система Android.Graphics.Bitmap, источник. Описание строки) [0x0008d] в <072ebd6d3ae947ac8b3980f8fd1aeee1>: 0 в EventApp.ProfileListActivity.OnActivityResult (код запроса System.Int32, код результата Android.App.Result, код Android.App.Result, данные Android.Content.Intent): событие: \ \ \ \ App \ Event \ in \ \ \ App \ \ \ App \ Event \ in \\ ProfileListActivity.cs: 1310 --- Конец управляемой трассировки стека Java.Lang.IllegalStateException --- java.lang.IllegalStateException: Не удалось создать уникальный файл: / storage / emulated / 0 / Pictures Title image / jpeg на android.os. Parcel.createException (Parcel.java:2079) в android.os.Parcel.readException (Parcel.java:2039) в android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:188) в android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java: 140) в android.content.ContentProviderProxy.insert (ContentProviderNative.java:481) в android.content.ContentResolver.insert (ContentResolver.java:1828) в android.provider.MediaStore.createPending (MediaStore.java:6)на android.provider.MediaStore $ Images $ Media.insertImage (MediaStore.java:1771)

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Изменить / Создать файл с использованием математической случайной функции, а не метки времени, и убедитесь, что объект FileOutputStream будет сброшен. для справки,

 private void SaveImage(Bitmap finalBitmap) {

        String root = Environment.getExternalStorageDirectory().toString();
        File myDir = new File(root + "/saved_images");    
         if (!myDir.exists()) {
                        myDir.mkdirs();
                    }
        Random generator = new Random();
        int n = 10000;
        n = generator.nextInt(n);
        String fname = "Image-"+ n +".jpg";
        File file = new File (myDir, fname);
        if (file.exists ())
          file.delete (); 
        try {
            FileOutputStream out = new FileOutputStream(file);
            finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();

        } catch (Exception e) {
             e.printStackTrace();
        }
    }
0 голосов
/ 06 ноября 2019

Насколько я знаю, этот метод устарел в API 29.

https://developer.android.com/reference/android/provider/MediaStore.Images.Media

insertImage(ContentResolver cr, String imagePath, String name, String description)

This method was deprecated in API level 29. inserting of images should be performed using MediaColumns#IS_PENDING, which offers richer control over lifecycle. 

Вы должны использовать MediaColumns # IS_PENDING для устройств, использующих API 29 +.

Подробнее: https://developer.android.com/training/data-storage/files/media#pending-media-files

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...