3-AIV--使用ContentProvider获得所有图片路径

简介: 零、前言[1].顾名思义,内容提供者,目的:实现跨进程间数据共享[2].基于数据库提供数据[3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取[4].如果只是想使用的人,直接把静态方法拷贝即可,想知道原理的,图片和注释认真看一下,也可以自己分析一下联系人的表。

零、前言

[1].顾名思义,内容提供者,目的:实现跨进程间数据共享
[2].基于数据库提供数据
[3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取
[4].如果只是想使用的人,直接把静态方法拷贝即可,想知道原理的,图片和注释认真看一下,也可以自己分析一下联系人的表。
[5].本文只打印一下查询结果:RecycleView篇将会界面展示数据,Xml篇将会介绍备份到本地

一、代码实现

1.实体类
/**
 * 作者:张风捷特烈
 * 时间:2018/4/18:11:36
 * 邮箱:1981462002@qq.com
 * 说明:文件夹实体类
 */
public class FolderBean {

    /**
     * 当前文件夹路径
     */
    private String dir;

    /**
     * 当前文件夹第一个照片的路径
     */
    private String firstImgPath;
    /**
     *
     */
    private String name;
    /**
     * 当前文件夹内图片数量
     */
    private int count;


    public String getDir() {
        return dir;
    }

    public void setDir(String dir) {
        this.dir = dir;
        String[] names = this.dir.split("/");
        this.name = names[names.length - 1];
    }

    public String getFirstImgPath() {
        return firstImgPath;
    }

    public void setFirstImgPath(String firstImgPath) {
        this.firstImgPath = firstImgPath;
    }

    public String getName() {
        return name;
    }


    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }


    @Override
    public String toString() {
        return "FolderBean{" +
                "dir='" + dir + '\'' +
                ", firstImgPath='" + firstImgPath + '\'' +
                ", name='" + name + '\'' +
                ", count=" + count +
                '}';
    }
2.获得所有图片路径的封装方法
/**
 * 作者:张风捷特烈
 * 时间:2018/4/14:10:15
 * 邮箱:1981462002@qq.com
 * 说明:获取手机,联系人工具类
 */
public class PhoneUtils_Picture {
    /**
     * 最大图片数量的文件夹图片数
     */
    public static int mMaxCount = 0;

    /**
     * 最大图片数量的文件夹
     */
    public static File mMaxCountDir = null;

    //////////////////////////获取手机的图片///////////////////////////////////

    public static List<FolderBean> getAllImagePath(Context ctx) {
        List<FolderBean> mFolderBeans = new ArrayList<>();

        //[1]查询获得游标:content://media/external/images/media
        Uri mIngUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        ContentResolver resolver = ctx.getContentResolver();
        Cursor cursor = resolver.query(mIngUri, null,
                MediaStore.Images.Media.MIME_TYPE + "=? or "
                        + MediaStore.Images.Media.MIME_TYPE + "=?",
                new String[]{"image/jpeg", "image/png"},
                MediaStore.Images.Media.DATE_MODIFIED);

        //[2]通过游标获取path,创建folderBean对象并赋值
        //[2-1]为避免重复扫描,将dirPath放入HashSet集合
        Set<String> mDirPaths = new HashSet<>();
        while (cursor.moveToNext()) {
            //获取数据库中图片路径:/storage/emulated/0/DCIM/Camera/IMG20160501152640.jpg
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            //获取父目录:/storage/emulated/0/DCIM/Camera
            File parentFile = new File(path).getParentFile();
            //没有父目录,跳出本次循环
            if (parentFile == null) continue;
            //声明实体对象
            FolderBean folderBean;
            //父目录的绝对路径:/storage/emulated/0/DCIM/Camera
            String dirPath = parentFile.getAbsolutePath();
            if (mDirPaths.contains(dirPath)) {
                continue;//集合中有这个目录 跳出本次循环
            } else {//集合中没有这个目录
                //加入集合
                mDirPaths.add(dirPath);
                //创建实体对象
                folderBean = new FolderBean();
                //父文件夹设置到folderBean
                folderBean.setDir(dirPath);
                //第一张图片路径设置到folderBean
                folderBean.setFirstImgPath(path);
            }

            if (parentFile.list() != null) {
                //根据父文件夹,过滤出所有以jpg,png,jpeg结尾的文件的数量
                int imgCount = parentFile.list(new FilenameFilter() {
                    @Override
                    public boolean accept(File dir, String name) {
                        return name.endsWith(".jpg") || name.endsWith(".png") || name.endsWith(".jpeg");
                    }
                }).length;

                if (mMaxCount <= imgCount) {
                    mMaxCount = imgCount;
                    mMaxCountDir = parentFile;
                }

                //设置文件夹下图片的数量
                folderBean.setCount(imgCount);
                //加入集合
                mFolderBeans.add(folderBean);
            }
        }
        cursor.close();
        return mFolderBeans;
    }
}
3.使用:

注意:查询数据库是耗时操作,为了不阻塞主线程,最好新建个线程操作

new Thread(new Runnable() {
    @Override
    public void run() {
        List<FolderBean> allImagePath = PhoneUtils_Picture.getAllImagePath(MainActivity.this);
        System.out.println(
        PhoneUtils_Picture.mMaxCountDir+ "文件夹图片数最多,有" +
        PhoneUtils_Picture.mMaxCount+"张");
        for (FolderBean folderBean : allImagePath) {
        System.out.println(folderBean);
        }
    }
}).start();
4.结果:
图片.png

后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg
相关文章
|
存储 移动开发 JavaScript
H5加载Android本地路径图片
H5加载Android本地路径图片
1261 0
|
4月前
|
Java Android开发
Android系统 修改无源码普通应用为默认Launcher和隐藏Settings中应用信息图标
Android系统 修改无源码普通应用为默认Launcher和隐藏Settings中应用信息图标
546 0
|
2月前
保存网络图片在sdcard两个方法
保存网络图片在sdcard两个方法
24 0
|
SQL 数据库 Android开发
Android 访问系统相册选中图片,并返回该图片的路径
Android 访问系统相册选中图片,并返回该图片的路径
163 0
|
PHP
PHP实现自制随机图片API- 调用文件夹和引用网络图片
PHP实现随机图片API- 调用文件夹和引用网络图片
175 0
|
Android开发
Android开发 - ImageView加载Base64编码的图片
在我们开发应用的过程中,并不是所有情况下都请求图片的URL或者加载本地图片,有时我们需要加载Base64编码的图片。这种情况出现在服务端需要动态生成的图片,比如: 二维码 图形验证码 … 这些应用场景有个共同点就是,这些图片都是由服务器动态生成,并不需要生成后保存成文件再返回给客户端。
2342 0
|
前端开发 Android开发
Android自定义无压缩加载超清大图
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/80878256 自定义无压缩加载超清大图 前言   已经很久没有写博客了,前段时间做项目就遇到加载超大图时系统内存溢出,我们一般处理加载图片时OOM的方法都是对图片进行压缩。
1303 0