Можно ли получить путь к файлу из сгенерированного FileRI URI? - PullRequest
0 голосов
/ 18 июня 2019

Учитывая, что в какой-то момент у меня есть URI, данный мне какой-то внешней библиотекой, и все настройки FileProvider выполнены правильно (и URI предоставлены разрешения на чтение / запись), как я могу получить путь к изображению на дискена что указывает URI?

Предположим, что файл изображения хранится в /sdcard/XYZAppFolder/file.jpg.

Во время отладки я вижу строку URI:

content://<applicationID>.provider/<virtualfolder>/file.jpg

Но, пытаясь выполнить запрос через ContentResolver, я получаю индекс -1:

Cursor cursor = contentResolver.query(contentURI, null, null, null, 
cursor.moveToFirst();
int idx = cursor.getColumnIndex(Images.ImageColumns.DATA);


<paths>
<external-path
        name="virtualfolder"
        path="VISUAPP" />
</paths>

Манифест:

<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/file_paths" />
</provider>

Любой другой способ получить абсолютный путь?

1 Ответ

1 голос
/ 18 июня 2019

как я могу получить путь к изображению на диске, на который указывает URI?

Вы не можете, если под "внешней библиотекой" вы подразумеваете "стороннюю"приложение".Кроме того, маловероятно, что у вас будет доступ к файлу в файловой системе, в любом случае:

  • Возможно, он находится во внутренней памяти
  • Может быть, в другом приложении другого приложенияместоположение на съемном носителе
  • Это может быть место на внешнем хранилище, к которому ваше приложение не может получить доступ на Android Q (по умолчанию с targetSdkVersion 29 или выше) или Android R (для всех приложений, по-видимому)

Если под «внешней библиотекой» вы подразумеваете библиотеку в своем собственном приложении, вы можете попробовать прочитать в XML-ресурсе метаданных FileProvider и использовать его, чтобы выяснить, какой корень и путь соответствуют <virtualfolder>отрезок пути.Оттуда вы можете сгенерировать File, который указывает на местоположение из этого корня, путь метаданных и остальную часть пути Uri.

Но при попытке выполнить запрос черезContentResolver, я получаю индекс -1:

FileProvider не поддерживает столбец DATA.Android Q и выше также блокируют столбец DATA от аналогичных запросов (например, на MediaStore), поэтому любой код, который у вас есть, полагается на него, может иметь проблемы с запуском очень скоро.

Используйте ContentResolver (например, openInputStream()) для работы с Uri.

...