Android с использованием FileProvider для генерации URI для файла - PullRequest
0 голосов
/ 07 августа 2020

Поскольку мое приложение нацелено на API> 24, мне нужно использовать FileProvider для обработки файлов / Uris.

В этом сценарии пользователь может выбрать мультимедийный файл (видео или изображение) следующим образом:

        val intent = Intent(
        Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        )
        intent.type = "image/* video/*"
        startActivityForResult(intent, MEDIA_PICKED)

Отсюда я собираю Uri и сохраняю его как строку. Позже пользователь может открыть носитель, вызвав такое намерение, как:

        val intent = Intent(Intent.ACTION_VIEW, fileUri)
        intent.setDataAndType(fileUri, "video/*")
        startActivity(intent)

Однако я получаю сообщение об ошибке, потому что Uri должен быть сгенерирован через FileProvider начиная с API 24. Итак, после прочтения документации и несколько примеров, у меня проблема с provider_paths. xml, в качестве примера из документации:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    ...
</paths>

Но, поскольку пользователь выбрал любой носитель на телефоне, я понятия не имею, что это за * Значения 1012 * name и path будут в моих provider_paths. Это зависит от телефона к телефону, и пользователи могут загружать видео с камеры из DCIM или загруженное видео из загрузок. В каждом примере я вижу, что пользователи что-то хранят в своем каталоге, например ExternalStorage + «my_app» + «имя_файла», чтобы они знали путь и имя своего каталога. Но как я могу использовать свой FileProvider, чтобы превратить файлы в действительные URI, если у меня нет этих файлов в известной папке хранения?

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Нет. Вам не нужно использовать FileProvider

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

В onActivityResult вы должны сохранить полученный uri и получить постоянное разрешение uri для него в чтобы сделать возможным использование uri позже.

Затем позже, используя ACTION_VIEW, используйте полученный uri и установите флаг FLAG_GRAND_READ_URI_PERMISSION.

0 голосов
/ 07 августа 2020

Задайте такой манифест:

<manifest ...>

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

    <application ...
        android:requestLegacyExternalStorage="true">
          ...
        <provider
            android:name="androidx.core.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 в ресурсах приложения с именем provider_paths:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_storage_root"
        path="." />
</paths>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...