使用FileProvider安全的共享文件 簡介篇
FileProvider
是ContentProvider
的一個子類,可以通過content://uri
的方式更安全的共享文件
可以在通過URI
的方式共享文件時,可以通過Intent
的setFlags()
賦予文件臨時的讀寫權(quán)限正歼,不需要
設(shè)置全局的讀寫權(quán)限
定義一個FileProvider
不需要繼承FileProvider
,只需要在AndroidManifest.xml
中定義一個<provider>
的組件即可脆炎,設(shè)置
android:name
的屬性為android.support.v4.content.FileProvider
,設(shè)置android:authorities
的屬性為packange_name.fileprovider
,設(shè)置android:exported
的屬性值為false
,因為FileProvider
不需要公開揽咕,設(shè)置android:grantUriPermissions="true"
這樣可以增加臨時權(quán)限,在meta-data
中指出
需要共享的文件夾路徑
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.demo.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
可以共享的文件
在meta-data
中需要指定需要共享的文件膜眠,有哪些文件可以通過FileProvider
來共享呢籽孙,需要在
xml/filepaths.xml中配置相關(guān)的路徑会钝,一般的格式如下
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="my_images" path="images/"/>
...
</paths>
paths
中可以包含一個或多個子元素伐蒋,name="name"
這個屬性相當(dāng)于path
的別名可以隱藏子目錄
path="path"
就是你要共享的目錄
-
應(yīng)用的內(nèi)部資源
可以通過
Context.getFilesDir()
獲得的路徑的子目錄<files-path name="name" path="path" />
-
應(yīng)用內(nèi)部的緩存文件夾
可以通過
getCacheDir()
獲得的路徑的子目錄<cache-path name="name" path="path" />
-
sdcard文件
可以通過
Environment.getExternalStorageDirectory()
獲得的子目錄<external-path name="name" path="path" />
-
應(yīng)用的外部儲存目錄
可以通過
Context.getExternalFilesDir(String)
獲得的子目錄<external-files-path name="name" path="path" />
-
應(yīng)用的外部緩存目錄
可以通過
Context.getExternalCacheDir()
獲得的子目錄<external-cache-path name="name" path="path" />
生成文件的URI
為了和另外一個app利用content URI
的方式共享文件,我們需要生成這個文件的URI迁酸,可以通過
getUriForFile()
方法生成文件的URI
File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
賦予URI臨時權(quán)限
-
Intent
的setData()
方法先鱼,將數(shù)據(jù)放進Intent
中 - 通過
Intent
的setFlags()
方法設(shè)置臨時權(quán)限FLAG_GRANT_READ_URI_PERMISSION or FLAG_GRANT_WRITE_URI_PERMISSION
或者both - 將
Intent
發(fā)送到另一個app
接受處理Intent
另一個app接受處理對應(yīng)的文件即可