如何使用 MediaStore 从 Android 10 上的特定文件夹中读取图像

How to read Image from a specific folder on Android 10 using MediaStore

我正在尝试从 DCIM/Folder_Name(应用程序保存图像的位置)读取图像。我只需要从 Folder_Name 中像画廊一样显示图像。 我尝试将 MediaStore 与 query 和 cursor 一起使用。但我只出来了 bucket names,它是包含 images 的文件夹的名称。我不知道如何只过滤 Folder_name 里面的内容。这是我的代码。

val projection= arrayOf(MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.BUCKET_ID,
            MediaStore.Images.Media.BUCKET_ID)
val cursor: Cursor? = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection,"",null,MediaStore.Images.Media.DEFAULT_SORT_ORDER)
cursor?.moveToFirst()
if(cursor!=null){
    while (!cursor.isAfterLast){
        Log.d("CURSOr","Name "+cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)))
        cursor.moveToNext()
    }
}
cursor?.close()

如何在 Android 10 中使用 selection 查询 select 想要的文件夹内容 谢谢。

我在 RELATIVE_PATH 常量而不是 BUCKET_DISPLAY_NAME 上做了一个投影(这只是给你最后一个文件夹的名称)并使用下面的代码过滤掉 LIKE DCIM/Test% 的选择来自 DCIM/Test 文件夹的结果。

val projection = arrayOf(_ID, DATE_ADDED, BUCKET_DISPLAY_NAME, RELATIVE_PATH)
val selection = "${MediaStore.MediaColumns.RELATIVE_PATH} LIKE ?"
val selectionArgs = arrayOf("DCIM/Test%") // Test was my folder name
val sortOrder = "$DATE_ADDED DESC"

app.contentResolver.query(
    EXTERNAL_CONTENT_URI,
    projection,
    selection,
    selectionArgs,
    sortOrder
)?.use {
    val id = it.getColumnIndexOrThrow(_ID)
    val bucket = it.getColumnIndexOrThrow(BUCKET_DISPLAY_NAME)
    val date = it.getColumnIndexOrThrow(DATE_ADDED)
    val path = it.getColumnIndexOrThrow(RELATIVE_PATH)
    while (it.moveToNext()) {
        // Iterate the cursor
    }
}

这种方法的唯一缺点是 RELATIVE_PATH 适用于 API 29 (Q) 级及以上。

编辑: 将选择参数从 %DCIM/Test% 更改为 DCIM/Test%,如 Alejandro Gomez 所指出的。先验将匹配任何 DCIM 文件夹(包括系统默认文件夹),例如。 My/DCIM/Test/Sample.jpg 也将与 DCIM/Test/Sample.jpg.

一起出现在输出中