安卓7.0文件路徑適配 FileProvider

前言

原先有適配過,但是當時就copy能用就行了。最近在寫輪子工具,就再次查了下資料,就順便整個都瞭解一下,記錄下來。


適配7.0(既調用FileProvider)

  1. 創建provider數據

就是在清單文件manifest.xml中的application節點下面添加如下配置

<manifest>
	...
	<application>
	...
	<provider
		android:name="android.support.v4.content.FileProvider"
		android:authorities="你的包名.fileprovider"
		android:exported="false"
		android:grantUriPermissions="true">
		<meta-data
		    android:name="android.support.FILE_PROVIDER_PATHS"
		    android:resource="@xml/file_paths" /> <!--7.0配置文件路徑 我放在了xml下的file_paths中-->
	</provider>
	...
	</application>
</manifest>
參數 說明
android:name 你可以使用v4包提供的FileProvider或者自定義的只需要在name申明就好了,一般使用系統的就足夠了。
android:authorities 類似schema,命名空間之類。
android:exported false表示我們的provider不需要對外開放。
android:grantUriPermissions 申明爲true,你才能獲取臨時共享權限。
  1. 在res中創建配置文件

按上面的名字我們需要創建一個file_paths路徑文件
路徑名稱
代碼如下

<?xml version="1.0" encoding="utf-8"?>
<paths  xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="app" path="/" />
    <files-path name="app" path="/" />
    <cache-path name="app" path="/" />
    <external-cache-path name="app" path="/" />
    <external-files-path name="app" path="/" />
</paths>

以上name是代表生成的新uri的時候的拼接名稱,path代表前面參數路徑後拼接的內容
具體說明如下

參數 說明
files-path 調用context.getFilesDir()路徑下的文件 例 /data/user/0/包名/files
cache-path 調用context.getCacheDir()路徑下的文件 例 /data/user/0/包名/cache
external-cache-path 調用context.getExternalCacheDir()路徑下的文件 例 /storage/emulated/0/Android/data/包名/cache
external-files-path 調用context.getExternalFilesDir(String)路徑下的文件 例 /storage/emulated/0/Android/data/包名/files/Music
external-path 調用Environment.getExternalStorageDirectory()路徑下的文件 例 /storage/emulated/0
  1. uri API24以上的調用

在7.0(API24)之前直接打開文件代碼如下

        String mimeType = getTypeFromSuffix(file);
        Uri uri = Uri.fromFile(file);
        if (mimeType != null) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(uri, mimeType);
            context.startActivity(intent);
        }

在7.0(API24)以後需要用新的方法 修改如下

        String mimeType = getTypeFromSuffix(file);
        Uri uri = Uri.fromFile(file);
        if (mimeType != null) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                uri = FileProvider.getUriForFile(context, context.getPackageName() + FILEPROVIDER, file);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            }else {
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            intent.setDataAndType(uri, mimeType);
            context.startActivity(intent);
        }

其中FILEPROVIDERString FILEPROVIDER = ".fileprovider"; 其實這段就是最早上面清單文件的android:authorities內的值
加入的兩個flags是Intent.FLAG_GRANT_READ_URI_PERMISSION (臨時讀取權限)和Intent.FLAG_GRANT_WRITE_URI_PERMISSION(臨時寫入權限)
統一出現的getTypeFromSuffix(File)方法是用來獲取文件的後綴生成mimeType讓系統打開對應的文件工具


資料

Android7.0適配總結
谷歌中國 - Android 7.0 行爲變更

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章