本課程教你:
- 指定 FileProvider
- 指定可分享的目錄
為了安全在應(yīng)用之間分享文件约巷,你需要設(shè)置你的應(yīng)用提供一種處理文件的安全機(jī)制,該機(jī)制采用content URI的形式俊犯。Android FileProvider 組件基于你在XML中提供的內(nèi)容來產(chǎn)生文件的content URIs镀赌。本課程教你怎樣在你的應(yīng)用中添加一個默認(rèn)的 FileProvider,怎樣指定你想提供給其他應(yīng)用的文件。
注意:FileProvider 類是 v4 Support Library 的一部分另伍。關(guān)于這個庫的更多信息,請參考 Support Library Setup.
指定FileProvider
為了你的應(yīng)用定義一個 FileProvider 绞旅,你需要在manifest文件中設(shè)置一個入口摆尝。這個入口指定了使用content URIs需要的權(quán)限以及包含能夠分享的文件目錄的XML文件名稱。
下面這段代碼教你如何在manifest 文件中添加 <provider> 元素來指定一個 FileProvider 類因悲,相關(guān)的權(quán)限以及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 產(chǎn)生的content URIs使用時需要的授權(quán)。這本例子中晃琳,這個權(quán)限是com.example.myapp.fileprovider
讯检。對于你自己的應(yīng)用,指定一個由應(yīng)用的 android:package 值加上"fileprovider"字符串作為授權(quán)卫旱。關(guān)于授權(quán)的更多內(nèi)容人灼,請參考 Content URIs 和 android:authorities 相關(guān)的文檔。
<provider> 的子元素 <meta-data> 指向一個XML文件顾翼,該文件包含你希望分享的文件目錄投放。android:resource
屬性是文件的路徑和名字,不需要加上.xml
的擴(kuò)展名暴构。文件的內(nèi)容將在寫一部分介紹跪呈。
指定可分享的目錄
一旦你在應(yīng)用的manifest文件中添加了 FileProvider段磨,你需要指定包含你希望分享的文件的路徑。為了指定這個路徑耗绿,在你的工程res/xml/
子目錄下創(chuàng)建filepaths.xml
文件苹支。在這個文件里面為每一個路徑添加一個XML元素。下面這段代碼顯示了一個res/xml/filepaths.xml
具體內(nèi)容的例子误阻。這段代碼也顯示了如何在內(nèi)部存儲器的files/
目錄下分享一個子目錄的路徑债蜜。
<paths>
<files-path path="images/" name="myimages" />
</paths>
在這個例子中,<files-path>
標(biāo)簽分享了在你的應(yīng)用的內(nèi)部存儲器中的files/
路徑究反。path
屬性分享了files/
下面的images/
子目錄寻定。name
屬性告訴 FileProvider 對于files/images/
子目錄在content URIs中添加一個myimages
路徑段。
<paths>
元素可以有多個子元素精耐,每個子元素指定一個不同的分享路徑狼速。除了<files-path>
元素之外,你也可以使用<external-path>
來分享外部存儲器的路徑卦停,使用<cache-path>
來分享內(nèi)部緩存路徑向胡。關(guān)于指定分享路徑的子元素的更多信息,參見 FileProvider 相關(guān)文檔惊完。
注意:這個XML文件是唯一能指定分享路徑的方法僵芹,你不能在程序中動態(tài)的添加一個路徑。
現(xiàn)在小槐,對于你的應(yīng)用內(nèi)部存儲器的files
路徑以及files
子路徑下的文件拇派,你已經(jīng)完成了使用 FileProvider 為它們生成對應(yīng)的content URIs。當(dāng)你的應(yīng)用為文件生成一個content URI時凿跳,它包含指定在 <provider> 元素中的授權(quán)件豌、myimages/
路徑以及該文件的名字。
例如拄显,如果你根據(jù)本課程的代碼定義一個 FileProvider苟径,如果你請求default_image.jpg
的content URI,FileProvider 會返回下面的URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg