Android exposed beyond app through intent getdata

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 чтобы избежать конфликтов, импортированные зависимости могут указывать $.provider и другие широко используемые источники.

Последний шаг – изменить строку кода, приведенную ниже в

Надеюсь, это поможет … 🙂

Пожалуйста, см. Здесь полный код и решение .

Помимо решения, использующего 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 введите

Этот пример относится к внешнему пути, на который вы можете ссылаться здесь для получения дополнительных параметров. Это позволит вам обмениваться файлами, находящимися в этой папке и ее подпапке.

Теперь все, что осталось, – создать намерение следующим образом:

Читайте также:  Чем очистить android от мусора

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 для выведения некоторых из них):

  • этот тип загрузит все приложения на устройстве и позволит пользователю выбрать один из них для завершения действие.
  • если нет проводника файлов и пользователь выбирает другие приложения для загрузки вашего намерения, то другое приложение рухнет или просто покажет черный экран. Например. Вы используете галерею или другое приложение, чтобы запустить его, а не проводник, то Галерея приложение будет либо сбой или показать черный экран.
  • даже если есть проводник, но пользователь решает использовать другие приложения, другие приложения могут сбой
Читайте также:  Keymapper для андроид без рут прав

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 атрибут чтобы избежать конфликтов, импортированные зависимости могут указывать $.provider и другие широко используемые органы.

последним шагом является изменение строки кода ниже в

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 хочет, чтобы разработчики использовали схему контента, но система не готова к этому, в течение многих лет приложения были сделаны, чтобы использовать файлы не «контент», файлы могут быть отредактированы и сохранены обратно, в то время как файлы, обслуживаемые по схеме контента не может быть (не так ли?).

Источник

Оцените статью