如何在 API 低于 29 上从手机获取图像

Posted

技术标签:

【中文标题】如何在 API 低于 29 上从手机获取图像【英文标题】:How to get images from phone on API below 29 【发布时间】:2021-01-10 00:40:41 【问题描述】:

我为 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,
    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 中是否可以检索相册列表?或者我应该获取所有图像的列表,然后遍历它并挑选相册?

【问题讨论】:

【参考方案1】:

试试这个,即使使用 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,
            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"/>

【讨论】:

获取照片列表没有问题。我想知道如何获取照片缩略图(没有 Glide)和专辑列表。 MediaStore.Images.Media.BUCKET_NAME 在低于 29 的 API 中不可用。

以上是关于如何在 API 低于 29 上从手机获取图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 API 的情况下获取 Instagram 中标签的所有图像?

如何在 python 上从经度和纬度获取邮政编码?

如何在查询构建器 laravel 上从每个组中获取多个数据

如何在 mac os x 上从通过 USB 连接的多轨混音器获取输入

如何在 iphone 的 UIImageView 上从远程服务器加载图像?

如何通过其 API 从 Instagram 获取用户图像