Получить URI содержимого изображений, хранящихся на SD-карте, с помощью поставщика файлов

У меня есть файл изображения, хранящийся на SD-карте с абсолютным путем как - storage/4469-0C17/DCIM/..., и другое изображение, хранящееся во внутренней памяти с абсолютным путем - /storage/emulated/0/

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

Теперь я могу обмениваться изображениями, хранящимися во внутреннем хранилище, но для изображения, хранящегося во внешнем хранилище, возникает ошибка: -
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/4469-0C17/DCIM/....

Мой манифест -

<manifest>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application>
    .....
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
                <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>
    </application>
</manifest>

провайдер_пути.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

Код -

 Intent share = new Intent(Intent.ACTION_SEND);
 share.setType("image/*");
 File imageFileToShare = new File(filePath);
 Uri imageURI = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", imageFileToShare);
 share.putExtra(Intent.EXTRA_STREAM, imageURI);
 share.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 context.startActivity(Intent.createChooser(share, "Share Image"));

person Harshit    schedule 07.03.2017    source источник
comment
в файле provider_paths.xml вместо '.' пытаться '/'   -  person LearnPainLess    schedule 07.03.2017


Ответы (3)


и другое изображение, хранящееся во внутренней памяти с абсолютным путем

Это то, что Android SDK называет внешним хранилищем< /а>.

но для изображения, хранящегося во внешнем хранилище, выдается ошибка: java.lang.IllegalArgumentException: не удалось найти настроенный корень, содержащий /storage/4469-0C17/DCIM/....

Во-первых, это съемное хранилище, а не внешнее хранилище.

Во-вторых, FileProvider не поддерживает съемные носители.

person CommonsWare    schedule 07.03.2017
comment
Так что на Android N мое приложение все равно выйдет из строя. ? Есть ли способ поддержать это.? - person Harshit; 07.03.2017
comment
@Harshit: Насколько я знаю, ваше приложение не имеет прямого доступа к файловой системе storage/4469-0C17/DCIM/, поэтому я не уверен, откуда вы взяли этот путь. - person CommonsWare; 08.03.2017

Вместо того, чтобы использовать FileProvider, который, как вы сами видели, очень ограничен, вам лучше получить свой собственный провайдер из ContentProvider.

Затем вы можете обслуживать любой файл, который хотите.

В CommonsWare есть хороший пример настройки такого поставщика файлов.

person greenapps    schedule 07.03.2017

Добавьте в свой provider_paths.xml это:

<root-path path="." name="external_files" />
person EVIL SnaKe    schedule 28.09.2017