編寫:jdneo - 原文:http://developer.android.com/training/secure-file-sharing/setup-sharing.html
為了將文件安全地從我們的應用程序共享給其它應用程序,我們需要對自己的應用進行配置來提供安全的文件句柄(Content URI的形式)。Android的FileProvider組件會基於在XML文件中的具體配置為文件創建Content URI。本課將介紹如何在應用程序中添加FileProvider的默認實現,以及如何指定要共享的文件。
Note:FileProvider類隸屬於v4 Support Library庫。關於如何在應用程序中包含該庫,請參考:Support Library Setup。
為了給應用程序定義一個FileProvider,需要在Manifest清單文件中定義一個entry,該entry指明瞭需要使用的創建Content URI的Authority。此外,還需要一個XML文件的文件名,該XML文件指定了我們的應用可以共享的目錄路徑。
下例展示瞭如何在清單文件中添加<provider>
標籤,來指定FileProvider類,Authority及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字段指定了希望使用的Authority,該Authority針對於FileProvider所生成的content URI。本例中的Authority是“com.example.myapp.fileprovider”。對於自己的應用,要在我們的應用程序包名(android:package的值)之後繼續追加“fileprovider”來指定Authority。要更多關於Authority的知識,請參考:Content URIs,以及android:authorities。
<provider>
下的<meta-data>
指向了一個XML文件,該文件指定了我們希望共享的目錄路徑。“android:resource”屬性字段是這個文件的路徑和名字(無“.xml”後綴)。該文件的內容將在下一節討論。
一旦在Manifest清單文件中為自己的應用添加了FileProvider,就需要指定我們希望共享文件的目錄路徑。為指定該路徑,首先要在“res/xml/”下創建文件“filepaths.xml”。在這個文件中,為每一個想要共享目錄添加一個XML標籤。下面的是一個“res/xml/filepaths.xml”的內容樣例。這個例子也說明了如何在內部存儲區域共享一個“files/”目錄的子目錄:
<paths>
<files-path path="images/" name="myimages" />
</paths>
在這個例子中,<files-path>
標籤共享的是在我們應用的內部存儲中“files/”目錄下的目錄。“path”屬性字段指出了該子目錄為“files/”目錄下的子目錄“images/”。“name”屬性字段告知FileProvider在“files/images/”子目錄中的文件的Content URI添加路徑分段(path segment)標記:“myimages”。
<paths>
標籤可以有多個子標籤,每一個子標籤用來指定不同的共享目錄。除了<files-path>
標籤,還可以使用<external-path>
來共享位於外部存儲的目錄;另外,<cache-path>
標籤用來共享在內部緩存目錄下的子目錄。更多關於指定共享目錄子標籤的知識請參考:FileProvider。
Note: XML文件是我們定義共享目錄的唯一方式,不可以用代碼的形式添加目錄。
現在我們有一個完整的FileProvider聲明,它在應用程序的內部存儲中“files/”目錄或其子目錄下創建文件的Content URI。當我們的應用為一個文件創建了Content URI,該Content URI將會包含下列信息:
<provider>
標籤中指定的Authority(“com.example.myapp.fileprovider”);例如,如果本課的例子定義了一個FileProvider,然後我們需要一個文件“default_image.jpg”的Content URI,FileProvider會返回如下URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg