2017-01-13 15 views
1

我正在尋找一種方式來分享在以下情況下運行的應用程序之間的文件:在Android上的應用程序之間共享文件。有沒有什麼比ContentProvider更好的選擇?

  • 在我們的應用程序,有文件的列表。用戶點擊共享按鈕,我們向他展示選擇對話框,顯示可以接受文件的應用程序列表。例如,用戶可以選擇Gmail,創建該字母並附加到該字母選定的文件,或者用戶可以通過藍牙傳輸文件。
  • 該文件可以在我們的應用程序的私人目錄中。
  • 該文件可以在文件系統中的任何地方,除了需要root訪問權限的dirs。
  • 接收文件的應用程序可能沒有READ_EXTERNAL_STORAGE權限。
  • 它應該從API級別14到最新版本。

據我瞭解,滿足所有條件,唯一的辦法就是在我的應用程序中實現自定義ContentProviderFileProvider。該ContentProvider將提供該文件的內容URI,並且我們將該URI附加到ACTION_SHARE意圖與FLAG_GRANT_READ_URI_PERMISSION

我擔心我錯過了其他一些簡單而乾淨的解決方案。是否存在一些其他可靠的ContentProvider替代方案,如果存在,那麼它是什麼?

+1

對於您的場景使用基本的'FileProvider'需要兩行Java代碼,一行四行XML文件以及清單中少於十幾行代碼。你期望得到多少簡單? – CommonsWare

+0

@CommonsWare感謝您的回覆。我沒有仔細查看FileProvider的要求,但我已經看到了一些ContentProvider,對我來說他們需要大量的樣板代碼。但是,我很好用,只是對其他方式有一些完美主義的好奇心。對不起,如果我很煩。 – Dima

+1

實現一個'ContentProvider'正在加重。 'FileProvider'已經實現。您可以直接使用它,也可以對它進行子類化以獲得較小的兼容性修補程序(例如,我使用的修復程序有一個三行方法,就是這樣)。無可否認,'FileProvider'不一定會涵蓋你場景中的所有內容。值得注意的是,由於在編譯時不知道路徑,因此您無法使用具有可移動存儲的'FileProvider'。 – CommonsWare

回答

0

因此,我在FileProvider中發現了一個未公開的功能,它允許您從設備上的任何位置共享文件。這是root-path元素:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <root-path name="my_root"/> 
</paths> 

當使用root-pathFileProvider很好地滿足我的所有要求。實施只需要十幾行,FileProvider是一個很好的組件。

相關問題