2012-04-03 104 views
2

我正在研究一個功能,其中我的應用程序將從服務器下載文件,然後允許用戶在外部第三方應用程序中打開這些文件(假設用戶安裝了可以查看文件的應用程序類型)。Android:共享下載的文件

文件被下載並存儲爲字節數組,其中包含一些伴隨的元數據,其中包括MIME類型和文件擴展名。

自定義ContentProvider似乎是明顯的方式,因爲我的應用程序需要保留對下載文件的控制 - 即其他應用程序的訪問應該是隻讀的,並且我的應用程序應該控制是否/當文件被刪除。

說到實施我的自定義ContentProvider,我不清楚幾件事情。我看只有教程似乎在兩個

  1. 之間,共享數據所關心的是它不夠的,只是重寫和實現openFile()和實施query()insert()等爲「什麼也不做」存根的方法呢?
  2. 假設執行openFile()是要走的路,我該如何處理從字節數組創建ParcelFileDescriptor

注意:如果可能的話,我需要一直支持API級別3(Cupcake)。

回答

2

我做了一些更多的挖掘,終於遇到了this source開放Android AttachmentProvider實現(爲他們的電子郵件客戶端)。

因此,要回答我自己的問題:

  1. 它看起來像我需要實現openFile()getType()query()。他們的query()實現提供對顯示名稱,uri,文件大小和'_ID'列(as recommended by the dev guide)列的訪問。
  2. ParcelFileDescriptor s是專門設計用於與File s(我想是線索的名字!)所以唯一的方法是將字節數組寫入文件系統,然後爲該File創建一個ParcelFileDescriptor。幸運的是,我似乎可以寫入應用程序的私人文件夾,以防止其他應用程序與我的文件混淆。
+0

另一種可能是使用MemoryFile。我現在正在研究這個解決方案,希望性能比普通文件更快。 – Georgie 2013-03-10 23:23:54

+0

關於我上面的評論,我嘗試了在內容提供者openFile()實現中使用MemoryFile,但沒有成功。原因之一是支持與MemoryFile相關的ParcelFileDescriptor在最近的Android版本中已經消失。甚至在此之前它需要反射技巧才能訪問。 – Georgie 2013-03-15 03:09:27

+0

有什麼方法可以將字節數組傳遞給'ParcelFileDescriptor'嗎?出於安全原因,我無法在手機上保存PDF文件。 – 2015-06-15 20:29:45