工作中用到的一些工具类,做一个笔记,以便日后回顾~

1,路径为:data/data/包名/app_+APP_CONFIG /APP_CONFIG ,其中包名后面的app_是为调用时,系统自己加上的
        Context context ;
        private final String APP_CONFIG ="config";
        File dirConf= context.getDir(APP_CONFIG, Context.MODE_PRIVATE);
        File conf = new File(dirConf, APP_CONFIG);

     2,/data/data/<application package>/cache目录
        context.getCacheDir().getAbsolutePath();

     3,/data/data/<application package>/files目录
        context.getFilesDir().getAbsolutePath();

     4,取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
        context.getExternalFilesDir().getAbsolutePath();

     5,取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
        context.getExternalCacheDir().getAbsolutePath();

     6,/storage/sdcard/0这个储存路径需要申请权限
        Environment.getExternalStorageDirectory();

     7,以第一个常量为例,音乐类别的公共目录绝对路径为:/storage/emulated/0/Music。
        如果你使用文件管理器打开设备的外部存储空间的话,均可以看到这些公共目录文件夹。 

        Environment.getExternalStoragePublicDirectory(String type);
        Envinonment 类提供诸多 type 参数的常量,比如:

        DIRECTORY_MUSIC:Music
        DIRECTORY_MOVIES:Movies
        DIRECTORY_PICTURES:Pictures
        DIRECTORY_DOWNLOADS:Download

Android13 文件存储权限_工具

 

/**
 * 文件工具类
 *
 * @author mazhanzhu 2019年8月19日17:04:11
 */
public class FileUtils {
    public static final int SIZETYPE_B = 1;//获取文件大小单位为B的double值
    public static final int SIZETYPE_KB = 2;//获取文件大小单位为KB的double值
    public static final int SIZETYPE_MB = 3;//获取文件大小单位为MB的double值
    public static final int SIZETYPE_GB = 4;//获取文件大小单位为GB的double值
    public static final String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();

    /**
     * 格式转换文件大小
     *
     * @param context
     * @param fileSize
     * @return
     */
    @SuppressLint("NewApi")
    public static String formatFileSize(Context context, long fileSize) {
        return Formatter.formatFileSize(context, fileSize);
    }

    /**
     * 判断该文件是否存在
     *
     * @return
     */
    public static boolean isExist(String path) {
        try {
            File f = new File(path);
            if (f.exists()) {
                return true;
            }
        } catch (Exception e) {
            return false;
        }
        return false;

    }

    /**
     * 根据文件,读取里面的内容
     *
     * @param context  上下文
     * @param filename 文件的名字
     * @return 返回文件所包含的信息
     */
    public static String getLocalFile(Activity context, String filename) {
        String result = null;
        //内置sd卡路径
        File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + "/" + filename);
        Log.e("fd", "这是文件储存的路径: " + file.toString());
        if (file.exists()) {
            try {
                FileInputStream fis = new FileInputStream(file);
                // 把字节流转换为字节流
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        fis));
                result = br.readLine();
            } catch (Exception e) {
                e.printStackTrace();
                Log.e("fd", "文件读取错误: " + e.toString());
            }
        } else {
            ToastUtils.showToast("信息获取失败");
            context.finish();
        }
        return result;
    }

    /**
     * 判断手机是否安装某个应用
     *
     * @param context
     * @param appPackageName 应用包名
     * @return true:安装,false:未安装
     */
    public static boolean isApplicationAvilible(Context context, String appPackageName) {
        // 获取packagemanager
        PackageManager packageManager = context.getPackageManager();
        // 获取所有已安装程序的包信息
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
        if (pinfo != null) {
            for (int i = 0; i < pinfo.size(); i++) {
                String pn = pinfo.get(i).packageName;
                if (appPackageName.equals(pn)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 保存异常信息到文件
     *
     * @param data
     * @param file_name
     * @param isAppend  是否是追加, true为追加。  false为覆盖
     */
    public static void saveFile(String data, String file_name, boolean isAppend) {
        //内置sd卡路径
        File sdPath = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
        if (!sdPath.exists()) {
            sdPath.mkdirs();
        }
        Log.e("fd", "saveFile: " + sdPath.toString());
        File file = new File(sdPath, file_name);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file, isAppend);
            fos.write(data.getBytes("UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 获取文件指定文件的指定单位的大小
     *
     * @param filePath 文件路径
     * @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
     * @return double值的大小
     */
    public static double getFileOrFilesSize(String filePath, int sizeType) {
        File file = new File(filePath);
        long blockSize = 0;
        try {
            if (file.isDirectory()) {
                blockSize = getFileSizes(file);
            } else {
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log_Ma.e("获取文件大小", "获取失败!");
        }
        return FormetFileSize(blockSize, sizeType);
    }

    /**
     * 调用此方法自动计算指定文件或指定文件夹的大小
     *
     * @param filePath 文件路径
     * @return 计算好的带B、KB、MB、GB的字符串
     */
    public static String getAutoFileOrFilesSize(String filePath) {
        File file = new File(filePath);
        long blockSize = 0;
        try {
            if (file.isDirectory()) {
                blockSize = getFileSizes(file);
            } else {
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log_Ma.e("获取文件大小", "获取失败!");
        }
        return FormetFileSize(blockSize);
    }

    /**
     * 获取指定文件大小
     */
    public static long getFileSize(File file) {
        try {
            long size = 0;
            if (file.exists()) {
                FileInputStream fis = null;
                fis = new FileInputStream(file);
                size = fis.available();
            } else {
                file.createNewFile();
                Log_Ma.e("获取文件大小", "文件不存在!");
            }
            return size;
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * 获取指定文件夹
     *
     * @param f
     * @return
     * @throws Exception
     */
    public static long getFileSizes(File f) throws Exception {
        long size = 0;
        File flist[] = f.listFiles();
        for (int i = 0; i < flist.length; i++) {
            if (flist[i].isDirectory()) {
                size = size + getFileSizes(flist[i]);
            } else {
                size = size + getFileSize(flist[i]);
            }
        }
        return size;
    }

    /**
     * 将long类型的数据转成相应大小的字符串
     * <p>
     * (例:30.05MB、1.25GB、40.87KB)
     *
     * @param fileS 参数
     * @return 文件的大小描述
     */
    public static String FormetFileSize(long fileS) {
        DecimalFormat df = new DecimalFormat("0.00");
        String fileSizeString = "";
        String wrongSize = "0B";
        if (fileS == 0) {
            return wrongSize;
        }
        if (fileS < 1024) {
            fileSizeString = df.format((double) fileS) + "B";
        } else if (fileS < 1048576) {
            fileSizeString = df.format((double) fileS / 1024) + "KB";
        } else if (fileS < 1073741824) {
            fileSizeString = df.format((double) fileS / 1048576) + "MB";
        } else {
            fileSizeString = df.format((double) fileS / 1073741824) + "GB";
        }
        return fileSizeString;
    }

    /**
     * 转换文件大小,指定转换的类型
     *
     * @param fileS
     * @param sizeType
     * @return
     */
    public static double FormetFileSize(long fileS, int sizeType) {
        DecimalFormat df = new DecimalFormat("0.00");
        double fileSizeLong = 0;
        switch (sizeType) {
            case SIZETYPE_B:
                fileSizeLong = Double.valueOf(df.format((double) fileS));
                break;
            case SIZETYPE_KB:
                fileSizeLong = Double.valueOf(df.format((double) fileS / 1024));
                break;
            case SIZETYPE_MB:
                fileSizeLong = Double.valueOf(df.format((double) fileS / 1048576));
                break;
            case SIZETYPE_GB:
                fileSizeLong = Double.valueOf(df.format((double) fileS / 1073741824));
                break;
            default:
                break;
        }
        return fileSizeLong;
    }

    //android获取一个用于打开HTML文件的intent
    public static void Open_Html_File(Activity activity, File file) {
        Uri uri = Uri.parse(file.toString()).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(file.toString()).build();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri, "text/html");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }


--------------------注意7.0以上要配置动态SD卡动态权限,不然不好使,详情参考博客里面FileProvider配置!!!!!-------------------------------------------------

    //android获取一个用于打开图片文件的intent
    public static void Open_Image_File(Activity activity, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "image/*");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }

    //android获取一个用于打开PDF文件的intent
    public static void Open_PDF_File(Activity activity, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/pdf");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }

    //android获取一个用于打开文本文件的intent
    public static void Open_Text_File(Activity activity, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "text/plain");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }

    //android获取一个用于打开音频文件的intent
    public static void Open_Audio_File(Activity activity, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("oneshot", 0);
        intent.putExtra("configchange", 0);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "audio/*");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }

    //android获取一个用于打开视频文件的intent
    public static void Open_Video_File(Activity activity,File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("oneshot", 0);
        intent.putExtra("configchange", 0);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "video/*");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }


    //android获取一个用于打开CHM文件的intent
    public static void Open_Chm_File(Activity activity, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/x-chm");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }


    //android获取一个用于打开Word文件的intent
    public static void Open_Word_File(Activity activity, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/msword");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }

    //android获取一个用于打开Excel文件的intent
    public static void Open_Excel_File(Activity activity, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/vnd.ms-excel");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }

    //android获取一个用于打开PPT文件的intent
    public static void Open_PPT_File(Activity activity,File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }

    //android获取一个用于打开apk文件的intent
    public static void Open_Apk_File(Activity activity, File file) {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(android.content.Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        try {
            activity.startActivity(intent);
        } catch (Exception e) {
            ToastUtils.showToast("设备中没有安装支持该格式的程序");
        }
    }
    /**
     * 获取公共目录
     *
     * @param type DIRECTORY_MUSIC 音乐类型
     *             DIRECTORY_RINGTONES 铃声类型
     *             DIRECTORY_PODCASTS 播客音频类型
     *             DIRECTORY_ALARMS 闹钟提示音类型
     *             DIRECTORY_NOTIFICATIONS 通知提示音类型
     *             DIRECTORY_PICTURES 图片类型
     *             DIRECTORY_MOVIES 电影类型
     *             DIRECTORY_DOWNLOADS 下载文件类型
     *             DIRECTORY_DCIM 相机照片类型
     *             DIRECTORY_DOCUMENTS 文档类型
     * @return 相应类型目录文件
     */
    public File getExternalStoragePublicDirectory(String type) {
        File file = Environment.getExternalStoragePublicDirectory(type);
        if (!file.exists()) {
            file.mkdir();
        }
        return file;
    }

    public static String getTime(long time) {
//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        Date date = new Date(time);
        String name = dateFormat.format(date);
        return name;
    }

    /**
     * 获取文件指定文件的指定单位的大小
     *
     * @param filePath 文件路径
     * @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
     * @return double值的大小
     */
    public static double getFileOrFilesSize(String filePath, int sizeType) {
        File file = new File(filePath);
        long blockSize = 0;
        try {
            if (file.isDirectory()) {
                blockSize = getFileSizes(file);
            } else {
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log_Ma.Companion.e("获取文件大小", "获取失败!");
        }
        return FormetFileSize(blockSize, sizeType);
    }

    /**
     * 获取指定文件夹
     */
    private static long getFileSizes(File f) throws Exception {
        long size = 0;
        File flist[] = f.listFiles();
        for (int i = 0; i < flist.length; i++) {
            if (flist[i].isDirectory()) {
                size = size + getFileSizes(flist[i]);
            } else {
                size = size + getFileSize(flist[i]);
            }
        }
        return size;
    }

    /**
     * 将long类型的数据转成相应大小的字符串
     * <p>
     * (例:30.05MB、1.25GB、40.87KB)
     *
     * @param fileS 参数
     * @return 文件的大小描述
     */
    private static String FormetFileSize(long fileS) {
        DecimalFormat df = new DecimalFormat("0.00");
        String fileSizeString = "";
        String wrongSize = "0B";
        if (fileS == 0) {
            return wrongSize;
        }
        if (fileS < 1024) {
            fileSizeString = df.format((double) fileS) + "B";
        } else if (fileS < 1048576) {
            fileSizeString = df.format((double) fileS / 1024) + "KB";
        } else if (fileS < 1073741824) {
            fileSizeString = df.format((double) fileS / 1048576) + "MB";
        } else {
            fileSizeString = df.format((double) fileS / 1073741824) + "GB";
        }
        return fileSizeString;
    }

    /**
     * 转换文件大小,指定转换的类型
     */
    private static double FormetFileSize(long fileS, int sizeType) {
        DecimalFormat df = new DecimalFormat("0.00");
        double fileSizeLong = 0;
        switch (sizeType) {
            case SIZETYPE_B:
                fileSizeLong = Double.valueOf(df.format((double) fileS));
                break;
            case SIZETYPE_KB:
                fileSizeLong = Double.valueOf(df.format((double) fileS / 1024));
                break;
            case SIZETYPE_MB:
                fileSizeLong = Double.valueOf(df.format((double) fileS / 1048576));
                break;
            case SIZETYPE_GB:
                fileSizeLong = Double.valueOf(df.format((double) fileS / 1073741824));
                break;
            default:
                break;
        }
        return fileSizeLong;
    }

    /**
     * 将指定的文件按着给定的文件的字节数进行分割文件
     *
     * @param filepath 源文件的路径
     * @param fileSize 指定的小文件的大小[MB] 0:默认等分4份
     */
    public static ArrayList<File> divide(String filepath, int fileSize) {
        ArrayList<File> fileArrayList = new ArrayList<>();
        if (!isExist(filepath)) {
            ToastUtils.showToast("指定文件不存在");
        } else {
            FileInputStream in = null;
            try {
                File file = new File(filepath);
                long fileLength = getFileSize(file);
                long size = fileSize * 1024 * 1024;// MB-->byte
                if (size <= 0) {
                    size = fileLength / 4;
                }
                byte[] bytes = new byte[(int) size];
                // 取得被分割后的小文件的数目
                int num = (fileLength % size != 0) ? (int) (fileLength / size + 1) : (int) (fileLength / size);
                //输入文件流,即被分割的文件
                in = new FileInputStream(file);
                // 根据要分割的数目输出文件
                for (int i = 0; i < num; i++) {
                    File outFile;
                    try {
                        //fixme 特殊分割字符需要添加\\
                        String[] split = file.getName().split("\\.");
                        if (split.length == 2) {
                            outFile = new File(downpath, split[0] + "_" + i + ".part");
                        } else {
                            throw new Exception("");
                        }
                    } catch (Exception e) {
                        outFile = new File(downpath, file.getName() + "_" + i + ".part");
                    }
                    if (outFile.exists()) {
                        outFile.delete();
                    }
                    outFile.createNewFile();
                    // 构建小文件的输出流
                    FileOutputStream out = new FileOutputStream(outFile);
                    out.write(bytes, 0, in.read(bytes));
                    out.flush();
                    out.close();
                    fileArrayList.add(new File(outFile.getAbsolutePath()));
                }
            } catch (Exception e) {
                Log_Ma.Companion.e("Error[divide]:", e.toString());
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return fileArrayList;
    }

    /**
     * @param filepath 源文件的路径
     * @param destDir  目标文件夹
     * @param fileSize 拆分大小【单位MB】
     * @throws Exception
     */
    public static ArrayList<File> split(String filepath, String destDir, int fileSize) {
        ArrayList<File> list = new ArrayList<>();
        RandomAccessFile rand = null;
        try {
            // 创建文件对象
            File src = new File(filepath);
            File destFolder = new File(destDir);
            if (!destFolder.exists()) {
                destFolder.mkdirs();
            }
            rand = new RandomAccessFile(src, "r");// 输入流
            // 计算拆分后文件的: 个数
            double size = fileSize * 1024 * 1024;// MB-->byte
            int count = (int) Math.ceil(src.length() / size);

            byte[] buf = new byte[(int) size];
            int len = 0;
            for (int i = 1; i <= count; i++) {
                // 定义拆分后的文件
                File destFile;
                try {
                    //fixme 特殊分割字符需要添加\\
                    String[] split = src.getName().split("\\.");
                    destFile = new File(destDir, split[0] + "_" + i + "." + split[1]);
                } catch (Exception e) {
                    destFile = new File(destDir, src.getName() + "_" + i + ".mp4");
                }
                destFile.createNewFile();// 创建空的目标文件
                RandomAccessFile dest = new RandomAccessFile(destFile, "rw");// 输出流
                // 拷贝文件
                len = rand.read(buf);
                dest.write(buf, 0, len);
                dest.close();
                list.add(destFile);
            }
            return list;
        } catch (Exception e) {
            Log_Ma.Companion.e("Error[split]:", e.toString());
            // 关闭资源
            if (rand != null) {
                try {
                    rand.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            return list;
        }
    }

    //合并文件
    public static void merge(String srcDir, String destDir) throws Exception {
        // 多个输入流==>一个输出流
        File src = new File(srcDir);
        File[] files = src.listFiles();
        Arrays.sort(files, new Comparator<File>() {

            public int compare(File f1, File f2) {
                int index = f1.getName().lastIndexOf(".part");
                int num = Integer.parseInt(f1.getName().substring(index + 5));
                int index2 = f2.getName().lastIndexOf(".part");
                int num2 = Integer.parseInt(f2.getName().substring(index2 + 5));

                return num - num2;
            }
        });
        String formerName = "";
        for (File f : files) {
            if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
                formerName = f.getName().replaceAll(".part\\d", "");
                break;
            }
        }
        // 创建:一个输入流
        File formerFile = new File(destDir, formerName);
        System.out.println("原文件名===" + formerName);

        File parentFile = formerFile.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();// 创建父目录
        }
        if (!formerFile.exists()) {
            formerFile.createNewFile();
        }
        RandomAccessFile randTo = new RandomAccessFile(formerFile, "rw");// 输入流

        // 创建:多个输出流
        byte[] buf = new byte[1024];
        int len = 0;
        for (File f : files) {
            if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
                System.out.println("merge拆分的文件----" + f.getName());
                ;
                RandomAccessFile source = new RandomAccessFile(f, "r");// 输入流
                while ((len = source.read(buf)) != -1) {
                    randTo.write(buf, 0, len);
                }
                source.close();// 关闭资源
            }
        }
        randTo.close();// 关闭资源
        System.out.println("merge ok...");
    }
/**
     * 通知android媒体库更新文件夹
     *
     * @param filePath ilePath 文件绝对路径,、/sda/aaa/jjj.jpg
     */
    public static void scanFile(Context context, String filePath) {
        try {
            MediaScannerConnection.scanFile(context, new String[]{filePath}, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                            Log.i("*******", "Scanned " + path + ":");
                            Log.i("*******", "-> uri=" + uri);
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * Uri转file文件
     */
    public static File getFile(Activity activity, Uri uri) {
        String[] arr = {MediaStore.Images.Media.DATA};
        Cursor cursor = activity.getContentResolver().query(uri, arr, null, null, null);
        int imgIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String imgPath = cursor.getString(imgIndex);
        File file = new File(imgPath);
        return file;
    }
}
/**
     * Uri转file文件
     */
    public static File getFile(Activity activity, Uri uri) {
        String[] arr = {MediaStore.Images.Media.DATA};
        Cursor cursor = activity.getContentResolver().query(uri, arr, null, null, null);
        int imgIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String imgPath = cursor.getString(imgIndex);
        File file = new File(imgPath);
        return file;
    }