FileProvider共享檔案、快取

Wing_Li發表於2018-11-30

如果本文幫助到你,本人不勝榮幸,如果浪費了你的時間,本人深感抱歉。 希望用最簡單的大白話來幫助那些像我一樣的人。如果有什麼錯誤,請一定指出,以免誤導大家、也誤導我。 本文來自: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);
複製程式碼

如果哪裡有什麼問題,請一定批評指正。

來一張圖

相關文章