4

Я разрабатываю приложение для Android-камеры, и мы использовали uris в нескольких сценариях, например. доставляя данные результата с нашей камеры обратно в приложение, которое запустило нас для получения результата или когда IntentChooser открывается, когда пользователь нажимает кнопку совместного доступа.Содержимое Uri vs. File Uri: Что использовать в будущем?

В настоящее время мы использовали File Uris в большинстве случаев, потому что это казалось более безопасным решением. Работая с ContentResolver и MediaStore, всегда есть что-то, что может пойти не так. Кроме того, я помню, что некоторое время назад было довольно много приложений, которые не поддерживали Content Uris, но File Uris очень хорошо.

Однако мы получили от Google сообщение о том, что доставка с помощью файла Uris не позволяет их приложению Hangouts получить доступ к файлу, когда пользователь решил не предоставлять разрешения доступа к файлам Hangouts на Android 6.0.

Мой вопрос сейчас: Должен ли мы вообще переключаться с File Uris на Content Uris при доставке контента в другие приложения? Это то, что нужно делать, и должно ли каждое приложение полагаться на/поддерживать контент Uris?

+2

https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html – CommonsWare

+0

@CommonsWare отлично, спасибо! – mAx

ответ

3

Да, контент Url's - это путь.

В случае приложения для камеры я не уверен, что URL-адреса файлов были очень разумными - передав файл вызывающему приложению, откуда вы знаете, когда можете удалить файл? С URL-адресом контента вызывающее приложение запрашивает данные через URL-адрес, и когда вы его доставите, вы можете бесплатно загрузить свою копию ресурсов. (Если приложение хочет «постоянного» доступа к данным, доступным через URL-адрес контента, то он должен сам сохранить эти данные).

+0

, так что существует какое-то соглашение, что содержание uris очень временное, а файл uris - нет? В противном случае, как я должен знать, когда получатель моего контента Uri работает с ним? – mAx

+0

Все URL-адреса довольно временные - если вы хотите гарантировать, что вы получите одни и те же данные из URL-адреса, тогда вы кешируете эти данные, а не запрашиваете их несколько раз. В случае файловых URL-адресов, поскольку они просто указывают на файл, пользователи в конечном итоге используют их, не сообщая вам (как провайдеру), что они их использовали, поэтому у вас нет хорошего триггера, когда вы можете удалить основные файл (и часто пользователи ленивы, и считают файл как достаточно хорошую копию данных). – zmarties

+0

Хорошо ... похоже, что провайдер может определить, когда использовался контент, который он предоставил другому приложению. Не могли бы вы дать подсказку, как это сделать? Спасибо за ваши усилия! – mAx

0

Вы должны использовать контент uri для обмена файлами между приложениями. Начиная с Android 7.0, вы получите FileUriExposedException при передаче файла uri вне вашего приложения. Вот отрывок из behaviour changes starting android 7.0

для приложений, ориентированных на Android 7.0 Android рамка навязывает политику API StrictMode, который запрещает разоблачение файла: // URI, за пределами вашего приложения. Если намерение, содержащее URI файла, покидает ваше приложение, приложение выходит из строя с исключением FileUriExposedException.

Чтобы поделиться файлами между приложениями, вы должны отправить контент: // URI и предоставить временное разрешение доступа к URI.

 Смежные вопросы

  • Нет связанных вопросов^_^