如果本文幫助到你,本人不勝榮幸,如果浪費了你的時間,本人深感抱歉。 希望用最簡單的大白話來幫助那些像我一樣的人。如果有什麼錯誤,請一定指出,以免誤導大家、也誤導我。 本文來自:www.jianshu.com/users/320f9… 感謝您的關注。
在一個專案中突然看到了如下的程式碼,就很好奇這個東西是這麼用的。然後搜了搜,也沒發現什麼講這個東西的。
官方是這樣說的 :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.建立res/xml/filepaths.xml檔案
<paths>
<files-path path="images/" name="myimages" />
</paths>
複製程式碼
在這個檔案中,為每個目錄新增一個XML元素指定目錄。 paths 可以新增多個子路徑: 分享app內部的儲存; 分享外部的儲存; 分享內部快取目錄。(我遇到的就是分享的快取)
其中屬性的意思: 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讓系統的桌布來開啟自己專案的圖片。
//得到快取路徑的Uri
Uri contentUri = FileProvider.getUriForFile(getActivity(), "com.android.ted.gank.fileprovider", file);
//桌布管理的意圖
Intent intent = WallpaperManager.getInstance(getActivity()).getCropAndSetWallpaperIntent(contentUri);
//開啟一個Activity顯示圖片,可以將圖片設定為桌布。呼叫的是系統的桌布管理。
getActivity().startActivityForResult(intent, ViewerActivity.REQUEST_CODE_SET_WALLPAPER);
複製程式碼
如果哪裡有什麼問題,請一定批評指正。