- exposed beyond app through Intent.getData() #15
- Comments
- san0suke commented Jul 17, 2017
- marob commented Jul 18, 2017
- jodacame commented Mar 18, 2018
- frankvlocity commented Dec 24, 2018 •
- marob commented Jan 2, 2019
- parshwa1596 commented Jan 22, 2020
- marob commented Jan 22, 2020
- marob commented Jan 22, 2020
- parshwa1596 commented Jan 23, 2020
- parshwa1596 commented Jan 24, 2020
- the problem «. exposed beyond app through Intent.getData() » at Android N #358
- Comments
- xiaozhicheng commented May 14, 2017 •
- wkh237 commented May 14, 2017
- xiaozhicheng commented May 14, 2017
- sagar-teallabs commented Sep 12, 2017
- dantman commented Sep 16, 2017
- lll000111 commented Sep 17, 2017 •
- parthgandhi7 commented Nov 7, 2017
- parthgandhi7 commented Nov 7, 2017
- Android.os.FileUriExposedException: файл: ///storage/emulated/0/test.txt выставляется вне приложения через Intent.getData ()
- Исключение FileUriExposedException в Android
- обновление #1
- 3 ответов
- варианты
- вывод:
- андроид.ОС.FileUriExposedException: файл: / / / хранилище / эмулированный/0 / тест.txt подвергается за пределами приложения через намерение.метод GetData()
- 16 ответов
exposed beyond app through Intent.getData() #15
Comments
san0suke commented Jul 17, 2017
erro:
file:///storage/emulated/0/Download/nf.pdf exposed beyond app through Intent.getData()
The text was updated successfully, but these errors were encountered:
marob commented Jul 18, 2017
it seems to be an Android N-related issue as explained here and here.
- change your targetSdkVersion to 23 or lower. It is the easiest solution, but it’s only a workaround for now
- follow the recommendations in the blog post, but it requires modifications in the cordova-plugin-fileopener (you’re welcome to submit a pull request) and some configurations in your app (AndroidManifest.xml and res/xml/provider_paths.xml)
jodacame commented Mar 18, 2018
@marob solution #1 worked, thanks
frankvlocity commented Dec 24, 2018 •
it seems to be an Android N-related issue as explained here and here.
- change your targetSdkVersion to 23 or lower. It is the easiest solution, but it’s only a workaround for now
- follow the recommendations in the blog post, but it requires modifications in the cordova-plugin-fileopener (you’re welcome to submit a pull request) and some configurations in your app (AndroidManifest.xml and res/xml/provider_paths.xml)
Thank you so much for the suggestions! Both solutions worked!
- Solution 1: change AndroidManifest.xml file android:targetSdkVersion=»23″ and clean & rebuild.
- Solution 2: Found a PR does exactly what the blog post described. chingfeng@474a4cb
marob commented Jan 2, 2019
Indeed the #18 PR is pending as I have no time nor any project to test it against.
I could merge it but it seems risky without further testing.
parshwa1596 commented Jan 22, 2020
if targetsdk version is 29 what can i do?
marob commented Jan 22, 2020
if targetsdk version is 29 what can i do?
marob commented Jan 22, 2020
Either the chingfeng@474a4cb version is not working, or you’re not really using this version (make sure you clean and rebuild).
parshwa1596 commented Jan 23, 2020
if targetsdk version is 29 what can i do?
not solve using these solution.
parshwa1596 commented Jan 24, 2020
hi i got profile pic in pdf what can i do?
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Источник
the problem «. exposed beyond app through Intent.getData() » at Android N #358
Comments
xiaozhicheng commented May 14, 2017 •
The text was updated successfully, but these errors were encountered:
wkh237 commented May 14, 2017
@xiaozhicheng , please provide more detailed information about this issue, thanks.
xiaozhicheng commented May 14, 2017
The problem occurred on the Android 7 model,
installing Apk times wrong: android.os.FileUriExposedException:, file://xxxxx.apk, exposed, beyond, app, through, Intent.getData ()
sagar-teallabs commented Sep 12, 2017
dantman commented Sep 16, 2017
This could be a result of how RNFB uses PathResolver.getRealPathFromURI and the new File API to read files from common filesystem document providers instead of using getContentResolver().openInputStream(uri) .
lll000111 commented Sep 17, 2017 •
@wkh237 In this context, is it possible this function is wrong?
but if I see this right it should be
That change also satisfies Android studio, which complains about that method. It also complains about the empty onNewIntent just below («Method does not override method from its superclass»).
I don’t want to change anything in the «fetch» part of the code, I only do filesystem (fs.methods).
parthgandhi7 commented Nov 7, 2017
I am just doing android.actionViewIntent(res.path(), ‘image/png’) ( where res.path() returns ‘/storage/emulated/0/Download/CatHat1.jpg’ ) and it is giving me this error . Full stack trace of error :
Is any workaround or any kind of solution to this problem possible? If yes then please tell me as and when possible. I just want to open the downloaded file in its default file opener.
parthgandhi7 commented Nov 7, 2017
Update , This is not working on android N(7.0) only. It worked fine in 6.0. So i think whatever @sagar-teallabs and @dantman have written is the ultimate problem . Does anyone have a workaround or solution to this?
Источник
Android.os.FileUriExposedException: файл: ///storage/emulated/0/test.txt выставляется вне приложения через Intent.getData ()
При попытке открыть файл приложение сработает. Он работает под Android N, но на Android N он падает. Он срабатывает только при попытке открыть файл с SD-карты, а не из системного раздела. Некоторая проблема с разрешением?
Редактировать:
При таргетинге на Android N, file:// URI больше не разрешены. Мы должны использовать content:// URI. Однако моему приложению нужно открывать файлы в корневых каталогах. Есть идеи?
Если для вашей целевойSdkVersion 24 или выше, мы должны использовать класс FileProvider, чтобы предоставить доступ к определенному файлу или папке, чтобы сделать их доступными для других приложений. Мы создаем собственный класс, наследующий FileProvider , чтобы убедиться, что наш FileProvider не конфликтует с FileProviders, объявленным в импортированных зависимостях, как описано здесь .
Шаги для замены файла: // uri с контентом: // uri:
Добавить класс, расширяющий FileProvider
Добавьте тег FileProvider в тег AndroidManifest.xml под тегом. Укажите уникальный авторитет атрибута android:authorities чтобы избежать конфликтов, импортированные зависимости могут указывать $
Последний шаг – изменить строку кода, приведенную ниже в
Надеюсь, это поможет … 🙂
Пожалуйста, см. Здесь полный код и решение .
Помимо решения, использующего FileProvider , есть еще один способ обойти это. Проще говоря
В Application.onCreate() . Таким образом, VM игнорирует экспозицию URI файла.
метод
Позволяет проверить экспозицию файла, что также является поведением по умолчанию, если мы не настроим VmPolicy.
Я столкнулся с проблемой, что, если я использую URI content:// чтобы отправить что-то, некоторые приложения просто не могут этого понять. И понижение target SDK версии target SDK не допускается. В этом случае мое решение полезно.
Если ваша targetSdkVersion равна 24 или выше, вы не можете использовать file: значения Uri в Intents на устройствах Android 7.0+ .
targetSdkVersion до 23 или ниже, или
Поместите свой контент во внутреннее хранилище, затем используйте FileProvider чтобы сделать его доступным для других приложений
(Из этого образца проекта )
Сначала вам нужно добавить поставщика на AndroidManifest
Теперь создайте файл в папке с ресурсами xml (при использовании студии Android вы можете нажать Alt + Enter после выделения файлов_пакетов и выбрать создать параметр ресурса xml)
Далее в файле file_paths введите
Этот пример относится к внешнему пути, на который вы можете ссылаться здесь для получения дополнительных параметров. Это позволит вам обмениваться файлами, находящимися в этой папке и ее подпапке.
Теперь все, что осталось, – создать намерение следующим образом:
EDIT : я добавил корневую папку SD-карты в file_paths. Я проверил этот код, и он работает.
Если ваше приложение предназначено для API 24+, и вы все еще хотите / должны использовать файл: // intents, вы можете использовать хакерский способ отключить проверку времени выполнения:
Метод StrictMode.disableDeathOnFileUriExposure скрыт и задокументирован как:
Проблема в том, что мое приложение не является хромым, но скорее не хочет быть искалеченным с помощью контента: // намерений, которые не понятны многим приложениям там. Например, открытие mp3-файла с контентом: // схема предлагает гораздо меньше приложений, чем при открытии того же самого файла: // схема. Я не хочу платить за ошибки дизайна Google, ограничивая функциональность моего приложения.
Google хочет, чтобы разработчики использовали схему контента, но система не готова к этому, в течение многих лет приложения были сделаны для использования файлов, а не «содержимого», файлы можно редактировать и сохранять обратно, тогда как файлы, обслуживаемые по схеме контента, не могут быть Oни?).
@palash k ответ правильный и работает для внутренних файлов хранения, но в моем случае я хочу также открывать файлы из внешнего хранилища, мое приложение разбилось, когда открывался файл из внешнего хранилища, такого как sdcard и usb, но мне удалось решить проблему, изменив Provider_paths.xml из принятого ответа
Измените файл provider_paths.xml, как показано ниже.
И в классе java (без изменений, как принятый ответ, просто небольшое редактирование)
Это поможет мне исправить ошибку для файлов из внешних хранилищ. Надеюсь, это поможет кому-то с той же проблемой, что и моя 🙂
Использование fileProvider – путь. Но вы можете использовать это обходное решение:
Я использовал приведенный выше ответ Палаша, но он был несколько неполным, я должен был предоставить такое разрешение
Если targetSdkVersion больше 24 , то FileProvider используется для предоставления доступа.
Источник
Исключение FileUriExposedException в Android
мне нужно открыть папку во внутреннем хранилище, которое содержит изображения.
Я использую следующий код.
Java
пути
Манифест
xml / file_paths
фатальное исключение: основной процесс: android.приложения.БНБ.компания.myphotos, PID: Двадцать две тысячи четыреста восемьдесят два андроид.ОС.FileUriExposedException: файл: / / / хранение / эмулируется / 0 / фотографии/MyPhotos подвергаются за пределами приложения через намерение.getData ()
есть ли другой способ открыть папку во внутреннем хранилище? Спасибо!
обновление #1
и ошибка ушедший.
в любом случае я должен выбрать всегда приложение, чтобы открыть эту папку.
есть ли возможность использовать приложение «Мои файлы» по умолчанию для открытия определенной папки?
3 ответов
есть ли возможность использовать приложение «Мои файлы» по умолчанию для открытия определенной папки?
Да И Нет. Его не 100% гарантировано, что он будет работать на всех устройствах.
Edit 1:
Ниже приведен один из способов с помощью которого это можно сделать. Я тестировал на нескольких эмуляторах (под управлением Android N & Android O) и загружает файл по умолчанию исследователь:
MainActivity.java
AndroidManifest.xml
GenericFileProvider.java
file_paths.xml
вышеуказанный подход не работает на больших игроках, таких как samsung
варианты
1. Использование типа DocumentsContract.Document.MIME_TYPE_DIR
этот подход работает на несколько эмуляторов и ограниченный набор устройств. Он не работает с крупными игроками, такими как Samsung или Huawei.
2. Использование типа resource/folder
этот подход работает, только если пользователь установил приложение ES file explorer.
если вы решили использовать, то вы должны проверить, если какой-либо намерение доступно для обработки его с помощью:
диспетчер пакетов диспетчера пакетов = getActivity().getPackageManager();
3. Использование типа */*
этот подход работает, если пользователь выбирает приложение файлового менеджера из выбора намерения и отмечает его как приложение по умолчанию для обработки */* . Однако у него есть некоторые недостатки (Благодаря @CommonsWare для выведения некоторых из них):
- этот тип загрузит все приложения на устройстве и позволит пользователю выбрать один из них для завершения действие.
- если нет проводника файлов и пользователь выбирает другие приложения для загрузки вашего намерения, то другое приложение рухнет или просто покажет черный экран. Например. Вы используете галерею или другое приложение, чтобы запустить его, а не проводник, то Галерея приложение будет либо сбой или показать черный экран.
- даже если есть проводник, но пользователь решает использовать другие приложения, другие приложения могут сбой
4. Использование типа text/csv
это ограничит количество приложений, которые будут отображаться пользователю, но те же ограничения, когда используется. Приложения, которые могут обрабатывать csv будет отображаться, и если пользователь выберет его, то приложения будут сбой.
есть некоторые устройства конкретных реализаций доступны здесь как отметил @Academy of Programmer что требует определения намерения файлового менеджера по умолчанию и дополнительная потребность им.
вывод:
нет стандартного типа для его достижения, поскольку на данный момент нет стандарта, за которым следуют файловые менеджеры для поддержки определенного типа. В будущем, возможно, Google придумает какой-то подход. Лучшей альтернативой было бы реализовать свой собственный файловый менеджер, как это делает Dropbox или Google Drive. Существует несколько библиотек, которые предоставляют эту функцию.
Источник
андроид.ОС.FileUriExposedException: файл: / / / хранилище / эмулированный/0 / тест.txt подвергается за пределами приложения через намерение.метод GetData()
приложение сбой, когда я пытаюсь открыть файл. Он работает ниже Android нуга, но на Android нуга он падает. Это происходит только при попытке открыть файл с SD-карты, а не из системного раздела. Какие-то проблемы с разрешением?
android.ОС.FileUriExposedException: файл: / / / хранение / эмуляция / 0 / тест.txt подвергается за пределами приложения через Намерение.getData ()
Edit:
при таргетинге на Android нуга, file:// URI больше не разрешены. Мы должны использовать content:// URIs вместо этого. Однако мое приложение должно открывать файлы в корневых каталогах. Есть идеи?
16 ответов
если targetSdkVersion >= 24 , тогда мы должны использовать FileProvider класс, чтобы дать доступ к определенному файлу или папке, чтобы сделать их доступными для других приложений. Мы создаем собственный класс, наследующий FileProvider чтобы убедиться, что наш FileProvider не конфликтует с FileProviders, объявленными в импортированных зависимостях, как описано здесь.
шаги для замены file:// URI с content:// URI-код:
добавить расширение класса FileProvider
добавить тег FileProvider в AndroidManifest.xml под тегом. Укажите уникальный авторитет для android:authorities атрибут чтобы избежать конфликтов, импортированные зависимости могут указывать $
последним шагом является изменение строки кода ниже в
Edit: если вы используете намерение заставить систему открыть ваш файл, вам может потребоваться добавить следующую строку код:
смотрите, пожалуйста, полный код и решение было объяснено здесь.
кроме решения с помощью FileProvider есть другой способ обойти эту. Проще говоря
на Application.onCreate() . Таким образом, виртуальная машина игнорирует файл URI экспозицию.
метод
включает проверку экспозиции файла, которая также является поведением по умолчанию, если мы не устанавливаем VmPolicy.
я столкнулся с проблемой, что если я использую content:// URI чтобы отправить что-то, некоторые приложения просто не могут этого понять. И понижение target SDK версия не допускается. В этом случае мое решение полезно.
обновление:
как упоминалось в комментарии, StrictMode является диагностическим инструментом и не должен использоваться для этой проблемы. Когда я опубликовал этот ответ год назад, многие приложения могут получать только файл uris. Они просто разбиваются, когда я пытался отправить им uri FileProvider. Теперь это исправлено в большинстве приложений, поэтому мы должны пойти с решением FileProvider.
Если ваше приложение нацелено на API 24+, и вы все еще хотите / должны использовать file: / / intents, вы можете использовать hacky способ отключить проверку выполнения:
метод StrictMode.disableDeathOnFileUriExposure скрыт и задокументирован как:
проблема в том, что мое приложение не хромает, а скорее не хочет быть искалеченным с помощью content:// intents, которые не поняты многими приложениями. Например, открытие mp3-файла с содержимым: / / scheme предлагает гораздо меньше приложений, чем при открытии того же файл: схема//. Я не хочу платить за ошибки дизайна Google ограничивает функциональность моего приложения.
Google хочет, чтобы разработчики использовали схему контента, но система не готова к этому, в течение многих лет приложения были сделаны, чтобы использовать файлы не «контент», файлы могут быть отредактированы и сохранены обратно, в то время как файлы, обслуживаемые по схеме контента не может быть (не так ли?).
Источник