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