在我的應用程序中,我需要將動態解密文件傳遞給第三方應用程序,而不將其保存到設備。在運行時在第三方應用程序中打開解密文件而不存儲解密數據
例如:我有一個自創的加密文件,其中包含PDF文件和一些要求之前,可以顯示pdf文件。如果所有要求都是真實的,那麼該pdf文件應該由第三方PDF閱讀器顯示。
所以我需要開始一個新的意圖,但有問題。我必須提供我的pdf文件的URI,但我沒有URI,因爲我沒有將文件保存到設備。
有什麼辦法可以完成這項工作嗎?
在我的應用程序中,我需要將動態解密文件傳遞給第三方應用程序,而不將其保存到設備。在運行時在第三方應用程序中打開解密文件而不存儲解密數據
例如:我有一個自創的加密文件,其中包含PDF文件和一些要求之前,可以顯示pdf文件。如果所有要求都是真實的,那麼該pdf文件應該由第三方PDF閱讀器顯示。
所以我需要開始一個新的意圖,但有問題。我必須提供我的pdf文件的URI,但我沒有URI,因爲我沒有將文件保存到設備。
有什麼辦法可以完成這項工作嗎?
答:
的答案一起從CommensWare(和sample code)和this link我找到了一個半解決方案。
示例代碼展示瞭如何使用本地內容提供程序爲其他應用程序訪問本地文件。 第二個鏈接描述了刪除方法的實現,該方法即使在文件結構完全由第三方應用程序打開之前也會從該文件結構中刪除該文件(並解釋了爲什麼可能)。
所以基本上,解密後,你創建一個文件訪問內容提供商,打開它與另一個應用程序,並立即刪除它。
對於有根的手機,這仍然不是100%的解決方案,因爲它們可以監視本地文件結構更改,並在創建文件後立即複製該文件。
對於非常小的PDF或使用某種流加密算法加密的PDF,您可以創建管道ContentProvider
。使用管道,基本上將數據倒入一個OutputStream
,其中另一端使用Uri
和ContentResolver
檢索相應的InputStream
。
但是,堆空間的限制會嚴重限制文件的大小,如果無法以流方式處理它(例如,當您從HTTP中讀取字節時,即時解密並傳遞解密的字節到OutputStream
)。
Here is a sample創建這樣一個ContentProvder
。關於我自己的問題
但在您的示例中,您仍然使用位於資產文件夾中的文件。有動態生成的文件的例子嗎? – robokop 2013-04-23 14:32:43
@robokop:「但在您的示例中,您仍然使用位於資產文件夾中的文件」 - 正確。 「是否有一個動態生成文件的例子?」 - 可能不會。不同之處在於你在'OutputStream'中注入的內容。這是基本的Java I/O。 – CommonsWare 2013-04-23 14:37:23
第三方PDF閱讀器是否支持顯示已經在RAM中的文件,或者是否需要模擬實際文件? – 2013-04-23 12:25:43
我需要模擬一個實際的文件。我無法知道用戶將使用哪種PDF閱讀器。 – robokop 2013-04-23 14:08:31