Android官方開發文件Training系列課程中文版:分享檔案之配置檔案共享

sahadev發表於2016-04-07

原文地址:http://android.xsoftlab.net/training/secure-file-sharing/index.html

導言

APP經常需要給其它的APP提供一個或多個檔案。舉個例子,相簿APP可能需要提供檔案以供編輯,或者一個檔案管理的APP可能希望使用者在外部儲存器中的兩個區域之間複製貼上檔案。其中一種方式就是傳送端的APP可以分享檔案來響應接收端APP的請求。

在所有的例子中,使一個檔案從你的APP到另一個APP的唯一安全方式就是傳送這個檔案內容的URI地址到接收端APP,並且授予一個臨時的訪問許可權給這個URI。帶有臨時URI訪問許可權的內容URI是安全的,因為它只會被應用於接收這個URI的那個APP,並且會這個許可權會自動終止。Android的FileProvider元件提供了getUriForFile()方法來生成該檔案的內容URI地址。

如果你想分享少量的文字或者數字型資料,你應該傳送一個Intent,使這個Intent攜帶這些資料給其它APP。有關學習如何使用Intent來傳送簡單的資料,參見訓練課程Sharing Simple Data

這節課解釋瞭如何使用Android FileProvider元件生成的內容URI安全的在APP之間共享檔案。

設定檔案共享

為了從你的APP安全的提供檔案給其它APP,你需要配置你的APP以便對檔案提供安全的防護。Android的FileProvider元件會基於在XML中提供的引數對檔案的相應URI地址,。這節課展示瞭如何給APP新增預設的FileProvider實現,以及展示如何指定你要分享給其它APP的檔案。

Note:FileProvider是v4支援包的一部分。有關程式中包含該庫的更多資訊,請參見:Support Library Setup

指定FileProvider

給APP定義FileProvider需要在清單檔案中登記。在被登記的條目需要指定URI的許可權,和指定XML檔案的檔名一樣,這裡也需要指定被分享檔案的目錄。

下面這一小段程式碼展示瞭如何在清單檔案中新增< provider>元素,在這個元素中指明瞭FileProvider類,許可權和XML檔名:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
        ...>
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.myapp.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        ...
    </application>
</manifest>

在這個例子中,屬性android:authorities指明瞭由FileProvider生成的URI的許可權,這裡的許可權值是com.example.myapp.fileprovider。在自己的APP中,許可權是由APP的android:package值以及跟隨的”fileprovider”字串組成。有關學習更多許可權值的課程,請參見話題:Content URIs以及android:authorities的屬性文件。

< provider>的子元素< meta-data>指向了一個XML檔案,這個XML檔案指定了你想要分享出去的目錄。屬性android:resource的值是要分享檔案的路徑與名稱,只是這個檔名不帶.xml字尾。檔案的內容會在下節課描述。

指定可搜尋目錄

一旦在清單檔案中新增了FileProvider,那麼你還需要指定將要分享的檔案目錄。如果要指定,首先需要在工程的res/xml/子目錄中建立一個名為filepaths.xml的檔案。在這個檔案中,通過給每個目錄新增相應的XML元素來指定它們的目錄。下面程式碼展示了res/xml/filepaths.xml檔案中的樣例,這段程式碼中還演示瞭如何分享內部儲存器中files/目錄下的子目錄:

<paths>
    <files-path path="images/" name="myimages" />
</paths>

在這個例子中,標籤分享了一些目錄,這個目錄位於APP在內部儲存器中的files/目錄下。屬性path分享了files/目錄的子目錄images/目錄,屬性name則用於告訴FileProvider給檔案的URI新增files/images/子目錄下的路徑段 myimages。

< paths>元素可以擁有多個子元素,每一個元素分別指向相應的分享目錄。在附加的元素中,你可以使用元素來分享外部儲存器上的目錄,使用 元素分享內部儲存器上的目錄。學習更多有關分享指定目錄的子元素,請參見FileProvider的引用文件。

Note:使用XML檔案是分享指定目錄的唯一方式,你不可以動態的新增目錄。

你現在有了使用FileProvider對檔案生成相關URI的完整說明。當你的APP需要為檔案產生URI的時候,它包含了< provider>元素指定的許可權,以及檔案的路徑myimages/,還有檔案的名稱。

舉個例子,如果你通過這節課中的所有片段定義了一個FileProvider,以及你要請求一個default_image.jpg檔案的URI地址,那麼FileProvider會返回如下的URI:

content://com.example.myapp.fileprovider/myimages/default_image.jpg


相關文章