java.lang.IllegalArgumentException: не удалось найти настроенный корень, содержащий /uploads/b056441c611b4e0a9a35.jpg

Я получил эту ошибку при попытке поделиться изображением в Gmail с помощью FileProvider.

Androidmanifest.xml

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="staging.mytours.co"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_provider_paths" />
        </provider>

Файл file_provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="uploads" path="." />
</paths>

Код класса Java:

imageUri = FileProvider.getUriForFile(getApplicationContext(),"staging.mytours.co",new File(Uri.parse(http://staging.mytours.co/uploads/ + tour.getImageCover()).getPath()));
                Intent shareIntent = new Intent();
                shareIntent.setAction(Intent.ACTION_SEND);
                shareIntent.putExtra(Intent.EXTRA_SUBJECT, "TOUR:" + tour.getTitle());
                shareIntent.putExtra(Intent.EXTRA_TEXT, "My Tour");
                shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
                shareIntent.setType("image/*");
                shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                startActivity(Intent.createChooser(shareIntent, "Share via"));

Уже пробовали другие решения с этого сайта, но в моем случае ничего не помогло.

Обновление:

Я добавил следующую функцию для сохранения изображения в папку /data/co.mytours в хранилище.

public File DownloadFileFromURL()
    {
        String urlimage = http://staging.mytours.co/uploads/  + tour.getImageCover();
        int count;
        try {
            URL url = new URL(urlimage);
            URLConnection conection = url.openConnection();
            conection.connect();

            // download the file
            InputStream input = new BufferedInputStream(url.openStream(),
                    8192);

            // Output stream
            File storagePath = Environment.getExternalStorageDirectory();
            OutputStream output = new FileOutputStream(storagePath
                    + "/data/co.mytours");

            byte data[] = new byte[1024];

            long total = 0;

            while ((count = input.read(data)) != -1) {
                total += count;
                // writing data to file
                output.write(data, 0, count);
            }

            // flushing output
            output.flush();

            // closing streams
            output.close();
            input.close();

            return storagePath;

        } catch (Exception e) {
            Log.e("Error: ", "Exceptio Occured");
            return null;
        }

    }

И назовите это,

File imagepath = DownloadFileFromURL();
Uri imageUrishare = FileProvider.getUriForFile(getApplicationContext(), "co.mytours", new File(imagepath.getPath()));

Но по-прежнему появляется ошибка. Попытка вызвать виртуальный метод java.lang.String java.io.File.getPath() для ссылки на нулевой объект.


person Himanshu    schedule 14.04.2018    source источник


Ответы (1)


У вас есть URL-адрес HTTP. Это не локальный файл в файловой системе. Вы не можете создать объект File из URL-адреса HTTP.

Самый простой способ - встроить URL-адрес как часть вашего EXTRA_TEXT значения.

Если вы действительно хотите прикрепить изображение, вам необходимо:

  • Загрузите это изображение в файл
  • Сохраните этот файл в том месте, которое настроено для вашего FileProvider
  • Используйте объект File для своего getUriForFile() вызова для использования с EXTRA_STREAM
  • Используйте правильный тип MIME, а не image/*
person CommonsWare    schedule 14.04.2018
comment
Я обновил свой вопрос. После попытки, как вы сказали, но получение значения null. - person Himanshu; 15.04.2018
comment
@Himanshu: DownloadFileFromURL(), похоже, возвращается null. - person CommonsWare; 15.04.2018
comment
Да, я вижу это по ошибке, но не могу понять, что я сделал не так. - person Himanshu; 16.04.2018
comment
@Himanshu: Предположительно, вы ловите Exception, а затем возвращаете null. Изучите LogCat, чтобы узнать, есть ли трассировка стека Java, связанная с вашим кодом. - person CommonsWare; 16.04.2018
comment
Да, оттуда он получает значение null. Но я не знаю, где это исключение. Он выполняет input.close();, но не возвращает значение storagePath. - person Himanshu; 16.04.2018
comment
наконец-то удалось загрузить его в локальный файл. Но есть проблема Failed to find configured root that contains /data/data/co.mytours/files/images/test.jpg.. Файл присутствует в data/co.mytours/images/test.jpg. Я пишу <external-path name="images" path="." /> и авторитет co.mytours - person Himanshu; 16.04.2018