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