MediaStore.Images.Media.insertImage — java.io.FileNotFoundException — Android

Примечание. Аналогичный вопрос задается по ссылкам ниже SO, но ни одно из предложенных решений не сработало для меня, поэтому я начал эту тему.

  1. MediaStore.Images.Media. insertImage возвращает значение null при попытке сохранить изображение
  2. Почему Images.Media.insertImage возвращает значение null

Постановка проблемы: я загружаю изображение с URL-адреса, а затем пытаюсь поделиться им. Для этого мне нужен Uri, который я получаю, сохраняя изображение в MediaStore.Images.Media.

Код:

A. Полученное загруженное изображение из класса AsyncTask

public void processDownloadedImage(Bitmap bitmap) {
        if (bitmap == null) {
            Toast.makeText(this,"Image could not be downloaded and shared!",Toast.LENGTH_LONG).show();
        }
        else {
            downloadedImage = bitmap;
            checkPermissionShowShareSheet();
        }
    }

B. Проверка разрешения для Marshmallow и выше

public void checkPermissionShowShareSheet() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.System.canWrite(this)){
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},2909);
            }
            else {


            updateImageUri(downloadedImage);
            showShareSheet(downloadedImageUri);
        }
    }
    else {
        updateImageUri(downloadedImage);
        showShareSheet(downloadedImageUri);
    }
}

C. Получение изображения Uri

private void updateImageUri(Bitmap inImage){
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

        fixMediaDir();
        String path = MediaStore.Images.Media.insertImage(this.getContentResolver(), inImage, "SomeImage", null);
        storePathInSharedPreferences(path);
        Uri uri = Uri.parse(path);

        downloadedImageUri = uri;
    }

    void fixMediaDir() {
        File sdcard = Environment.getExternalStorageDirectory();
        if (sdcard != null) {
            File mediaDir = new File(sdcard, "DCIM/Camera");
            if (!mediaDir.exists()) {
                mediaDir.mkdirs();
            }
        }
    }

D. Файл манифеста использует разрешения

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

Проблема: значение, возвращаемое из нижней строки, равно нулю

String path = MediaStore.Images.Media.insertImage(this.getContentResolver(), inImage, "SomeImage", null);

Любые идеи?

Вот часть Stackbacktrace:

Failed to insert image java.io.FileNotFoundException: No such file or directory       
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:620)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:939)
at android.content.ContentResolver.openOutputStream(ContentResolver.java:686)
at android.content.ContentResolver.openOutputStream(ContentResolver.java:662)
at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:934)
at myorg.myapp.ImageDescription.updateImageUri(ImageDescription.java:165)

person Kratika Kulshreshtha    schedule 23.05.2016    source источник


Ответы (1)


Изменить это

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

To

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
person Franklyn    schedule 23.05.2016
comment
сделал, но тот же результат :( .. путь по-прежнему нулевой - person Kratika Kulshreshtha; 24.05.2016
comment
Я обновил свой пост частью обратной трассировки стека, пожалуйста, посмотрите - person Kratika Kulshreshtha; 24.05.2016