Множество действий Intent, таких как ACTION_VIEW, возьмите Uri, указывая на контент, над которым должно выполняться действие. Если содержимое поддерживается файлом - указывает ли Uri прямо на файл или на ContentProvider, обслуживающий файл ( см. FileProvider) - это обычно работает.
Существуют сценарии, в которых разработчики не хотят, чтобы контент находился в файле для совместного использования с другими приложениями. Один из распространенных сценариев для шифрования: дешифрованные данные должны находиться в ОЗУ, а не на диске, чтобы свести к минимуму риск того, что кто-то получит данные с расшифровкой.
Мое классическое решение для обмена с ОЗУ - использовать ParcelFileDescriptor и createPipe(). Однако, когда действие, отвечающее на ACTION_VIEW (или что-то другое), получает InputStream на этом канале, результирующий поток ограничен по сравнению с потоками, которые вы получаете, когда ContentProvider обслуживает содержимое из файла. Например, это примерное приложение отлично работает с Adobe Reader и выдает сообщение об ошибке QuickOffice.
Основываясь на , я полагаю, что createPipe() действительно создает канал, и что не доступны для поиска. В результате клиенты, которые пытаются "перемотать назад" или "быстро переправить", столкнулись с проблемами.
Я ищу надежное решение для совместного использования содержимого в памяти с сторонним приложением, которое обходит это ограничение. В частности:
-
Он должен использовать синтаксис
Uri, который, вероятно, будет выполняться клиентскими приложениями (т.е.ACTION_VIEWисполнителями); решения, которые включают в себя что-то тупое, что клиентские приложения вряд ли узнают (например, передают такие-то с помощьюIntentextra), не квалифицируются -
Данные для совместного использования не могут быть записаны в файл как часть совместного использования (конечно, клиентское приложение может завершить сохранение полученных байтов на диск, но пусть игнорирует этот риск на данный момент)
-
В идеале это не связано с тем, что приложение хочет поделиться данными, открывающими
ServerSocketили иным образом усугубляя риски безопасности
Возможные предлагаемые идеи включают:
-
Как можно перенастроить
createPipe(), что приводит к поиску трубки -
Некоторый способ использования основанного на сокетах
FileDescriptor, который приводит к поисковой трубе -
Какой-то RAM-диск или что-то еще, что похоже на файл для остальной части Android, но не стойкий
Ключевым критерием, если хотите, рабочего решения является то, что я могу получить PDF файл из ОЗУ, который QuickOffice может читать.
Любые предложения?
Спасибо!