为什么我从外部存储加载图像的光标是空的

Why is my Cursor for loading images from external storage empty

使用这种加载外部图像的方法,我总是得到一个空光标,不知道为什么。它之前也适用于一个模拟器配置,但现在当我尝试记录 ID 的内容时,它说: android.database.CursorIndexOutOfBoundsException:请求索引 -1,大小为 0。模拟器上的图片安装在 3 个不同的外部目录中。

private suspend fun loadImages(): List<Image>
    {
        return withContext(Dispatchers.IO) {
            val uri = if(Build.VERSION.SDK_INT >= 29) {
                MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
            } else MediaStore.Images.Media.EXTERNAL_CONTENT_URI
            requireActivity().contentResolver.query(uri, arrayOf(MediaStore.Images.Media._ID),
                null, null, "${MediaStore.Images.Media.DATE_ADDED} ASC"
            )?.use { cursor ->
                val photos = mutableListOf<Image>()
                val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
                while(cursor.moveToNext()) {
                    val id = cursor.getLong(idColumn)
                    val contentUri = ContentUris.withAppendedId(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)
                    photos.add(Image(id, contentUri))
                }
                photos
            } ?: listOf()
        }
    }

pic of working image gallery

与往常一样,我的问题完全不同。模拟器出问题了,我重置它并再次上传图像,它现在可以工作了。现在没有调度程序,代码有点改变。

private fun loadImages(): List<Image>
    {
        val photos = mutableListOf<Image>()
        val uri = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
        } else MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        requireActivity().contentResolver.query(uri, arrayOf(MediaStore.Images.Media._ID),
            null, null, null
        )?.use { cursor ->
            val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
            while(cursor.moveToNext()) {
                photos.add(Image(ContentUris.withAppendedId(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getLong(idColumn))))
            }
            return photos.toList()
        } ?: return listOf()
    }

这是现在的代码,它工作正常