kotlin语言利用协程遍历系统相册返回img类型集合
时间: 2023-07-25 13:15:09 浏览: 143
好的,以下是一个利用Kotlin协程遍历系统相册并返回img类型集合的示例代码:
```kotlin
import android.net.Uri
import android.provider.MediaStore
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
// 定义一个数据类,用于存储图片信息
data class ImageInfo(val id: Long, val uri: Uri)
// 利用协程遍历系统相册,并返回img类型集合
suspend fun getImages(): List<ImageInfo> = withContext(Dispatchers.IO) {
val images = mutableListOf<ImageInfo>()
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.SIZE
)
val selection = "${MediaStore.Images.Media.MIME_TYPE} = ?"
val selectionArgs = arrayOf("image/jpeg", "image/png", "image/gif")
val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"
val cursor = applicationContext.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
cursor?.use {
val idColumn = it.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (it.moveToNext()) {
val id = it.getLong(idColumn)
val uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id.toString())
images.add(ImageInfo(id, uri))
}
}
return@withContext images
.filter { it.uri.toString().endsWith(".jpg", true) || it.uri.toString().endsWith(".jpeg", true) || it.uri.toString().endsWith(".png", true) || it.uri.toString().endsWith(".gif", true) }
}
// 在协程中遍历相册,并输出每张图片的路径
suspend fun main() {
val images = getImages()
val imgUris = images.map { it.uri }
// 在这里可以对图片Uri进行操作,例如显示到ImageView中
}
```
在这个示例代码中,我们首先定义了一个`ImageInfo`数据类,用于存储每张图片的ID和Uri信息。然后,我们使用`MediaStore`提供的API在IO线程中遍历系统相册,并将每张图片的ID和Uri信息存储在一个`ImageInfo`对象中,最后将所有的`ImageInfo`对象存储在一个`List`集合中返回。在`getImages()`函数中,我们使用`filter()`函数过滤掉非图片类型的文件。最后,我们在`main()`函数中将所有图片的Uri存储在一个`List`集合中,可以将这些Uri显示到ImageView中或进行其他操作。
需要注意的是,这个示例代码仅演示了如何遍历系统相册并返回img类型集合,实际应用中还需要处理文件读取、异常情况等问题。
阅读全文