




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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
List<String>
imageList;//这个文件夹下的图片集合
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)
{
=
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<String>
getImageList()
{
return
imageList;
}
public
void
setImageList(List<String>
imageList)
{
this.imageList
=
imageList;
}
}步骤3:先声明好list等变量,避免一会看代码不知道某个变量怎么来的privateList<PictureBean>beanList;//最后我们会把所有的文件夹模型都放到这里,你要是问图片在哪?当然是在PictureBean的imageList里啦步骤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;
}
List<String>
pathList
=
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<String>
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
List<String>
list
=
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()
{
@Ove
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年军队文职人员招聘之军队文职管理学考前冲刺模拟试卷A卷含答案
- 2025年军队文职人员招聘之军队文职公共科目题库检测试卷B卷附答案
- 2025年消防设施操作员之消防设备高级技能能力提升试卷B卷附答案
- 采购分包资源配置合同(2篇)
- 2023年全国硕士研究生考试《管理类联考综合能力》试题真题及答案
- 2025年党史竞赛知识题库70题及答案
- 会计学成本会计模拟试题集
- 各行业各年度数据对比表格
- 泰坦尼克号的文化价值和社会反思:高中语文教学教案
- 经济学微观经济学知识点归纳与解析
- 07SG111-1 建筑结构加固施工图设计表示方法
- 屋顶分布式光伏发电EPC项目 投标方案(技术方案)
- 网约车停运损失费起诉状模板
- 中国急性缺血性卒中诊治指南(2023)解读
- A型肉毒素治疗知情同意书 注射知情同意书
- 混凝土采购项目整体供货方案
- 血液透析导管溶栓及护理
- 公司外聘人员管理制度
- 慢病联合用药病
- 兰州拉面-模板参考
- 武汉市2024届高中毕业生二月调研考试(二调)英语试卷(含答案)
评论
0/150
提交评论