Android 7.0 使用FileProvider 在应用间共享文件

和大家分享一篇关于Android 7.0 如何自定义一个通用的fileProvider吧。

(1)声明provider


    
        
            
        
    

值得注意的是

1:在AndroidX的项目中用到的是:androidx.core.content.FileProvider,如果你们的项目还没有迁移到android的话,还是要用这个:android.support.v4.content.FileProvider

2:authorities 这个属性的值建议不要写死,因为我们可能多个项目都会引用到,所以用项目动态包名代替

 (2)编写resource xml file



    
    
    
    
    
    
    

    
    
    

其中paths节点包含以下几种类型:

 

      其中path代表改目录下面的子目录如:Environment.getExternalStorageDirectory()/flynn

  1. :代表设备的根目录new File("/");
  2. :   代表context.getFilesDir()
  3. : 代表context.getCacheDir()
  4. : 代表Environment.getExternalStorageDirectory()
  5. : 代表context.getExternalFilesDirs()
  6. : 代表getExternalCacheDirs()

 (3) 自定义URI获取类

package com.example.flynnlibrary.fileprovider;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;


import androidx.core.content.FileProvider;

import java.io.File;

/**
 * 文件路径申请权限
 */
public class FlynnFileProvider {
    public static Uri getUriForFile(Context context, File file) {
        Uri fileUri = null;
        if (Build.VERSION.SDK_INT >= 24) {
            fileUri = getUriForFileResult(context, file);
        } else {
            fileUri = Uri.fromFile(file);
        }
        return fileUri;
    }

    public static Uri getUriForFileResult(Context context, File file) {
        Uri fileUri = FileProvider.getUriForFile(context,
                context.getPackageName() + ".flynn.fileprovider",
                file);
        return fileUri;
    }


    public static void setIntentDataAndType(Context context,
                                            Intent intent,
                                            String type,
                                            File file,
                                            boolean writeAble) {
        if (Build.VERSION.SDK_INT >= 24) {
            intent.setDataAndType(getUriForFile(context, file), type);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            if (writeAble) {
                intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            }
        } else {
            intent.setDataAndType(Uri.fromFile(file), type);
        }
    }
}

在使用的时候要记得替换:FileProvider.getUriForFile(context,context.getPackageName() + ".flynn.fileprovider", file);   换成自己在manifest中定义好的authorities

注意setIntentDataAndType()调用方法为:

FileProvider7.setIntentDataAndType(this, intent, "application/vnd.android.package-archive", file, true);

 

 至此自定义fileprovider的工作就完成啦。目前使用到fileprovider的地方主要是拍照还有安装apk等。当然还有其他的,都可以用 这个方式去访问file。

你可能感兴趣的:(android)