如何使用 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
.
一起出现在输出中
我正在尝试从 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
.