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

问题描述

我正在尝试从DCIM / Folder_Name(应用程序保存图像的位置)中读取图像。我只需要从该Folder_Name中像画廊一样显示图像。 我尝试将MediaStore与query和cursor一起使用。但是我只使用存储桶名称列出存储桶名称,该名称是包含图像的文件夹的名称。我不知道如何只过滤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中使用选择查询来选择所需的文件内容 谢谢。

解决方法

我对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)及更高级别。