Android中如何自定义一个图片选择器
发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,本文小编为大家详细介绍"Android中如何自定义一个图片选择器",内容详细,步骤清晰,细节处理妥当,希望这篇"Android中如何自定义一个图片选择器"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
千家信息网最后更新 2024年11月12日Android中如何自定义一个图片选择器
本文小编为大家详细介绍"Android中如何自定义一个图片选择器",内容详细,步骤清晰,细节处理妥当,希望这篇"Android中如何自定义一个图片选择器"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
步骤1:动态申请权限
private boolean permissionOpen() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {//动态申请读写权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 101); } else { getImages();//有权限的话直接去获取手机图片 return true; } return false; }
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == 101) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { getImages();//申请权限成功之后,去获取手机图片 } else { Toast.makeText(this, "权限申请失败", Toast.LENGTH_LONG).show(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
步骤2:给手机图片做一个模型,我的想法是以每一个放图片的文件夹为一个模型,说通俗点,A文件夹下边有3张图片a.jpg,b.jpg,c.jpg,B文件夹下有2张图片,d.jhpg,e.jpg,我就给A和B等等这种文件夹做一个模型
public class PictureBean {//我的想法是以每一个放图片的文件夹为一个模型 private String name;//文件夹的名字,以后会用到,具体用处可以先打开微信的图片选择器,点左下角视频和图片,弹出一个popupwindow,每一个item都有一个name,他这个name应该是图片父目录的文件名,我这个name也是这个意思,不过这篇博客应该暂时用不到 private int number;//这个文件夹下图片的数量 private String firstImageUrl;//这个文件夹下的第一张图片 private ListimageList;//这个文件夹下的图片集合 private String parentPath;//这个文件夹的绝对路径 public String getParentPath() { return parentPath; } public void setParentPath(String parentPath) { this.parentPath = parentPath; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public String getFirstImageUrl() { return firstImageUrl; } public void setFirstImageUrl(String firstImageUrl) { this.firstImageUrl = firstImageUrl; } public List getImageList() { return imageList; } public void setImageList(List imageList) { this.imageList = imageList; }}
步骤3:先声明好 list等变量,避免一会看代码不知道某个变量怎么来的
private List
步骤4:看getImages()方法
private void getImages() { new Thread(new Runnable() {//查询图片什么的,肯定要开一个线程就不解释了 @Override public void run() { Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;//这个Uri代表要查询的数据库名称加上表的名称 ContentResolver contentResolver = context.getContentResolver();//这个用的少不知道该怎么表达,反正就是对外共享数据呗,提供手机里的各种数据(视频,图片,文件) Cursor cursor = contentResolver.query(imageUri, null, MediaStore.Images.Media.MIME_TYPE//这个就是查询操作了吧(cursor,游标,听起来很熟悉,老师绝对讲过,不过原谅我数据库这一块渣到爆炸) + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?", new String[]{"image/jpeg"}, MediaStore.Images.Media.DATE_MODIFIED); if (cursor == null) { return; } ListpathList = new ArrayList<>();//同一个文件夹下的图片的集合 String mParentPath = "";//所在文件夹的绝对路径 while (cursor.moveToNext()) { String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));//图片的绝对路径 File file = new File(path).getParentFile(); String parentPath = file.getAbsolutePath();//文件夹的绝对路径 if (cursor.isFirst()) {//如果是第一个图片 pathList.add(path);//直接加到图片集合里 mParentPath = parentPath;//文件夹的绝对路径 等于 我们获取到的这张图片的 文件夹的绝对路径 } else if (mParentPath.equals(parentPath)) {//如果 新的图片的文件夹的绝对路径 跟上一张图片的文件夹的绝对路径相同, 说明两张图片在同一个文件夹下 pathList.add(path);//继续填到集合里 } else {//说明 新的图片跟 上一张图片不在同一个文件夹 下 List list = new ArrayList<>(); list.addAll(pathList); //用一个新的list 加载 之前一个文件夹下的所有图片(这里暂时想不到更好的办法了) pathList.clear(); pathList.add(path); //旧的list 清空之后呢, 开始加载 新的文件夹下的 第一张图片(仔细看一看就知道逻辑了,代码写的确实比较烂,哈哈哈) PictureBean bean = new PictureBean();//我们之前写好的模型 bean.setNumber(list.size()); //数量就是list的数量 bean.setFirstImageUrl(list.get(0)); //第一张图片 bean.setImageList(list);//图片集合 bean.setParentPath(mParentPath);//所在文件夹的绝对路径 beanList.add(bean);//把模型放到步骤3定义好的list mParentPath = parentPath; //文件夹绝对路径 变成了 新的文件夹路径 } } //到此为止,喜大普奔,所有的图片都已经获取到了,接下来直接显示出来(想做复杂的呢可以参考微信,我正在参考中...) handler.sendEmptyMessage(1); } }).start(); }
步骤5:因为我们这次是简单版,既然图片数据都有了,就简单的展示一下好了
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { final Listlist = new ArrayList<>(); //因为是简单版,我就直接把所有的图片都存到一个list里用来显示了 for (PictureBean pictureBean : beanList) { for (String s : pictureBean.getImageList()) { list.add(s); } } adapter.setList(list); adapter.notifyDataSetChanged(); adapter.setmOnClick(new ItemAdapter.onClick() { @Override public void itemOnClick(int position) {//点击事件就是把被点击的图片的绝对路径返回去 Intent intent = new Intent(); intent.putExtra("image", list.get(position)); setResult(RESULT_OK, intent); finish(); } }); } };
读到这里,这篇"Android中如何自定义一个图片选择器"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
图片
文件
文件夹
路径
模型
步骤
数据
权限
选择
就是
手机
手机图片
数量
文章
查询
代码
内容
动态
变量
名称
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
使学生加深对数据库安全的理解
护苗网络安全课视频下载
ib服务器imm远程管理
湖州企业网络安全准入控制系统
威海市网络安全知识竞赛答案
代码设计和数据库设计谁先谁后
双流区网络安全吗
潍坊ios软件开发公司
赤壁市欧尔软件开发工作室
视图里的服务器资源管理器
软件开发不是it
wow服务器转移
如何做到网络安全小倡议
软件开发投标进度计划
火绒安全服务器搭建
网络安全在社会发展中的作用
天猫精灵软件开发
上海通用软件开发现价
服务器需要插几个网线
网络安全与计算机病毒
杭州专业软件开发要多少钱
香港服务器 租赁
网络安全审计系统收费
江苏ntp网络时钟服务器ip
机关网络安全监看制度
重庆幕义互联网科技有限公司
网络安全管理验收文档
数据库能存储多大的文件
服务器平台属于什么税收编码
网络安全整治讲话