android查询所有照片,Android查询外部存储中所有照片

本文介绍了如何实现自定义相册模块,核心在于查询手机中照片并进行筛选。通过MediaStore API获取外部存储的图片,依据日期、类型和文件大小进行排序和过滤,排除GIF和视频,确保文件存在且为有效图片。同时,代码演示了如何使用Uri加载图片,并提供了对照片进行分类操作的可能性。注意,数据库查询需在工作线程执行,并申请外部存储读写权限。
摘要由CSDN通过智能技术生成

最近写了个自定义相册模块,其中比较核心的算是查询照片了,直接上代码吧

val contentUri = MediaStore.Files.getContentUri("external")

val sortOrder = MediaStore.Files.FileColumns.DATE_MODIFIED + " DESC"

val selection =

"(${MediaStore.Files.FileColumns.MEDIA_TYPE} = ? OR ${MediaStore.Files.FileColumns.MEDIA_TYPE} = ?) AND ${MediaStore.MediaColumns.SIZE} > 0"

val selectionAllArgs = arrayOf(MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE.toString())

val projections = arrayOf(

MediaStore.Files.FileColumns._ID,

MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DISPLAY_NAME,

MediaStore.MediaColumns.DATE_MODIFIED, MediaStore.MediaColumns.MIME_TYPE,

MediaStore.MediaColumns.WIDTH, MediaStore.MediaColumns.HEIGHT,

MediaStore.MediaColumns.SIZE, MediaStore.Video.Media.DURATION

)

val cursor = context.contentResolver.query(contentUri, projections, selection, selectionAllArgs, sortOrder) ?: return

if (cursor.moveToFirst()) {

val idCol = cursor.getColumnIndex(MediaStore.MediaColumns._ID)

val pathCol = cursor.getColumnIndex(MediaStore.MediaColumns.DATA)

val nameCol = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)

val mimeType = cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE)

do {

val id = cursor.getString(idCol)

//这里得到path其实就可以利用glide来显示照片了,但还是建议用uri

val path = cursor.getString(pathCol)

val name = cursor.getString(nameCol)

val type = cursor.getString(mimeType)

//过滤gif

if (name.endsWith(".gif", true)) {

continue

}

//过滤视频

if (type.contains("video")) {

continue

}

val file = File(path)

if (!file.exists() || !file.isFile) {

continue

}

//这里拿到uri

val uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)

//这里可以对照片进行分类操作,

...

} while (cursor.moveToNext())

}

cursor.close()

数据库查询要放到工作线程处理,而且别忘了申请外部存储读写权限

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值