如何在29以下的API上从手机获取图像

问题描述

我为Android开发了图片库应用(最低SDK 23,目标SDK 29)。我试图从手机中获取照片列表。这里的代码:

val list: MutableList<Photo> = mutableListOf()
val projection = arrayOf(
    MediaStore.Images.Media._ID,MediaStore.Images.Media.DATE_TAKEN,MediaStore.Images.Media.ORIENTATION,MediaStore.Images.Media.SIZE
)

val query = contentResolver?.query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection,null,MediaStore.Images.Media.DATE_TAKEN + " DESC"
)
query?.use { cursor ->
    if (cursor.count != 0) {
        val idIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID)
        val sizeIndex = cursor.getColumnIndex(MediaStore.Images.Media.SIZE)
        while (cursor.moveToNext()) {
            val id = cursor.getLong(idIndex)
            val size = cursor.getInt(sizeIndex)

            val contentUri: Uri = ContentUris.withAppendedId(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,id
            )
            val photo = Photo(contentUri,size)
            list.add(photo)
        }
    }
}

但是Android Studio对我说,某些MediaStore字段需要API级别29+。 (例如MediaStore.Images.Media.DATE_TAKEN,MediaStore.Images.Media.ORIENTATION,MediaStore.Images.Media.DATA等)。 Screen from AS. 所以我的问题是我应该如何在29以下的API上获取图像列表? 工作室也对contentResolver.loadThumbnail()方法说了同样的话。

还有一个相邻的问题:在Android中是否可以检索相册列表?还是我应该获取所有图像的列表,然后遍历并挑选出相册?

解决方法

尝试一下,即使使用API​​ 29也可以使用:

private fun getAllImages(activity: Activity): ArrayList<Photo>? {
    var cursor: Cursor? = null
    var i = 0
    val arrayList: ArrayList<Photo> = ArrayList()
    if (cursor == null) {
        val resolver = activity.contentResolver
        cursor = resolver.query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null
        )
        if (cursor != null) {
            while (i < cursor.count) {
                cursor.moveToPosition(i)
                val fieldIndex: Int = cursor.getColumnIndex(MediaStore.Images.Media._ID)
                val id: Long = cursor.getLong(fieldIndex)
                val imageUri =
                    ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,id)
                arrayList.add(Photo("",imageUri))
                i++
            }
            cursor.close()
        }
    }
    return arrayList
}


data class Photo(var name: String,var uri: Uri)

使用任何图像加载器库,例如Glide或Picasso:

Glide.with(this).load(getAllImages(this)!![0].uri).into(imgView)

将此权限添加到清单中,并确保已授予

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...