安卓7.0文件路径适配 FileProvider

前言

原先有适配过,但是当时就copy能用就行了。最近在写轮子工具,就再次查了下资料,就顺便整个都了解一下,记录下来。


适配7.0(既调用FileProvider)

  1. 创建provider数据

就是在清单文件manifest.xml中的application节点下面添加如下配置


	...
	
	...
	
		 
	
	...
	

参数 说明
android:name 你可以使用v4包提供的FileProvider或者自定义的只需要在name申明就好了,一般使用系统的就足够了。
android:authorities 类似schema,命名空间之类。
android:exported false表示我们的provider不需要对外开放。
android:grantUriPermissions 申明为true,你才能获取临时共享权限。
  1. 在res中创建配置文件

按上面的名字我们需要创建一个file_paths路径文件
安卓7.0文件路径适配 FileProvider_第1张图片
代码如下



    
    
    
    
    

以上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 行为变更

你可能感兴趣的:(程序日记)