如果本文幫助到你结借,本人不勝榮幸娄涩,如果浪費了你的時間,本人深感抱歉映跟。
希望用最簡單的大白話來幫助那些像我一樣的人蓄拣。如果有什么錯誤,請一定指出努隙,以免誤導大家球恤、也誤導我。
本文來自:http://www.reibang.com/users/320f9e8f7fc9/latest_articles
感謝您的關注荸镊。
在一個項目中突然看到了如下的代碼咽斧,就很好奇這個東西是這么用的。然后搜了搜躬存,也沒發(fā)現什么講這個東西的张惹。
官方是這樣說的 :FileProvider 是一個特殊的 ContentProvider 的子類,它使用 content:// Uri 代替了 file:/// Uri. 岭洲,更便利而且安全的為另一個app分享文件宛逗。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.android.ted.gank.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/paths"/>
</provider>
官方也提供了一個非常簡單的例子:
1. 在AndroidManifest.xml里面配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<permission
android:name="com.example.myapp..ACCESS_UPDATE_RESULT"
android:protectionLevel="signature"/>
<uses-permission android:name="com.example.myapp.ACCESS_UPDATE_RESULT"/>
<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>
注意要添加權限
我們可以看到在<meta-data中,定義了一個資源路徑盾剩,然后就是第二步
2.創(chuàng)建res/xml/filepaths.xml文件
<paths>
<files-path path="images/" name="myimages" />
</paths>
在這個文件中雷激,為每個目錄添加一個XML元素指定目錄。
paths 可以添加多個子路徑:
<files-path> 分享app內部的存儲告私;
<external-path> 分享外部的存儲屎暇;
<cache-path> 分享內部緩存目錄。(我遇到的就是分享的緩存)
其中屬性的意思:
path=“images/” 就是你所要共享的文件路徑驻粟。
name="myimages" 就是告訴FileProvider 用 myimages 添加進URIs 內容字段去訪問 files/images/ 的子目錄根悼。
3.然后就可以通過URI訪問app 的文件了
content://com.example.myapp.fileprovider/myimages/default_image.jpg
可以看到:
com.example.myapp.fileprovider:前面是我們在AndroidManifest.xml中指定的;
myimages:是我們指定的 name蜀撑;
default_image.jpg:就是我們想要訪問的圖片了挤巡。
例如,我看到到這個項目屯掖,分享的是緩存路徑下的圖片玄柏,然后用Uri讓系統(tǒng)的壁紙來打開自己項目的圖片肠阱。
//得到緩存路徑的Uri
Uri contentUri = FileProvider.getUriForFile(getActivity(), "com.android.ted.gank.fileprovider", file);
//壁紙管理的意圖
Intent intent = WallpaperManager.getInstance(getActivity()).getCropAndSetWallpaperIntent(contentUri);
//開啟一個Activity顯示圖片藏雏,可以將圖片設置為壁紙。調用的是系統(tǒng)的壁紙管理算墨。
getActivity().startActivityForResult(intent, ViewerActivity.REQUEST_CODE_SET_WALLPAPER);
如果哪里有什么問題绍坝,請一定批評指正徘意。