许多Intent
操作(例如ACTION_VIEW
)都采用Uri
指向应对其执行操作的内容。如果内容由文件支持-Uri
是直接指向文件还是服务于文件的ContentProvider
(see FileProvider
),则通常可以正常工作。
在某些情况下,开发人员不想让内容驻留在文件中以便与其他应用程序共享。一种常见的情况是加密:解密后的数据应驻留在RAM中,而不是磁盘上,以最大程度地降低有人获取解密后的数据的风险。
我从RAM共享的经典解决方案是use ParcelFileDescriptor
and createPipe()
。但是,当响应ACTION_VIEW
(或其他内容)的 Activity 在该管道上获得InputStream
时,与ContentProvider
提供文件中的内容时得到的流相比,结果流受到限制。例如,this sample app与Adobe Reader配合良好,会使QuickOffice崩溃。
基于past related问题,我的假设是createPipe()
确实在创建管道,而pipes are non-seekable。试图“倒带”或“快进”的客户因此遇到了问题。
我正在寻找一种可靠的解决方案,用于与第三方应用程序共享内存内容,从而克服了这一限制。具体来说:
Uri
实现者)认可的ACTION_VIEW
语法;涉及到客户端应用程序不太可能识别的钝度的解决方案(例如,通过Intent
额外地通过某某方式传递)不符合ServerSocket
或以其他方式加剧安全风险可能的建议构想包括:
createPipe()
的某种方法,导致可搜索的管道FileDescriptor
的某种方法,该方法导致可搜索的管道一个可行的解决方案的一个关键标准是,是否可以从RAM中获取QuickOffice可以读取的PDF。
有什么建议?
谢谢!
最佳答案
您提出了一个非常困难的要求组合。
让我们来看看您的解决方案构想:
Possible suggested ideas include:
Some way to reconfigure createPipe() that results in a seekable pipe
Some way to use a socket-based FileDescriptor that results in a seekable pipe
Some kind of RAM disk or something else that feels like a file to the rest of Android but is not persistent
第一个不起作用。这个问题是由OS实现的管道基元从根本上是不可寻求的。原因是支持寻求,这将要求OS缓冲整个管道的“内容” ...直到读取端关闭。这是无法实现的……除非您对可通过管道发送的数据量进行限制。
出于几乎相同的原因,第二个也不起作用。操作系统级别的套接字不可搜索。
在一个层面上,最终构想(RAM文件系统)的工作与Android OS支持这种功能的模数有关。 (毕竟,可以找到Ramfs文件。)但是,文件流不是管道。特别是,对于文件流和管道,关于文件结尾的行为是不同的。从读者的角度来看,要使文件流看起来像管道流,将需要在那一侧添加一些特殊的代码。 (该问题类似于在日志文件上运行
tail -f
的问题...)不幸的是,我认为没有其他方法可以使文件描述符相对于文件末尾表现得像管道,并且也是可寻求的……根本不需要对操作系统进行根本性的修改。
如果您可以更改从流中读取的应用程序,则可以解决此问题。事实是,fd需要由QuickOffice读取和查找(我假设您无法修改)的事实排除在外。 (但是,如果您可以更改应用程序,则有多种方法可以使这项工作...)
顺便说一句,我认为您在Linux或Windows上的这些要求会有一些问题。而且它们不是特定于Java的。
更新
关于此有很多有趣的评论,我想在这里解决一些问题:
那是可以实现的吗?
从理论上讲,只要“坏蛋”没有打开或重新启动设备,就可以从理论上检索此数据。
ashmem
:这些问题也适用于旧式的
shmem
...,但是 channel 设置可能更困难。 这将不需要修改读取(接收器)应用程序。
但是,第三个(特权)应用程序仍可能会进入RAMfs,在内存中找到未链接的文件,然后读取它。
但是,在回顾了以上所有内容之后,最实用的解决方案仍然是修改读取(接收器)应用程序,以将整个输入流读取为
byte[]
,然后在缓冲的数据上打开ByteArrayInputStream
。核心应用程序可以随意查找和重置它。
关于android - 通过Seekable Pipe或Stream与其他Android应用共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21538989/