从存储访问框架(SAF)接收的具有Uri的Android contentResolver.query
以前我有一个逻辑,我在外部存储器上找到了所需的文件夹(使用我自己的文件选择器,它将文件返回到所选文件夹),然后使用路径作为前缀查询其中的所有媒体文件,有一个逻辑:从存储访问框架(SAF)接收的具有Uri的Android contentResolver.query,android,android-file,android-contentresolver,android-fileprovider,android-storage,Android,Android File,Android Contentresolver,Android Fileprovider,Android Storage,以前我有一个逻辑,我在外部存储器上找到了所需的文件夹(使用我自己的文件选择器,它将文件返回到所选文件夹),然后使用路径作为前缀查询其中的所有媒体文件,有一个逻辑: fun loadAudio(path: String): List<Audio> { val contentResolver = context.contentResolver val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
fun loadAudio(path: String): List<Audio> {
val contentResolver = context.contentResolver
val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Albums.ALBUM_ID
)
val selection = "${MediaStore.Audio.Media.IS_MUSIC} != 0 AND ${MediaStore.Audio.Media.DATA} LIKE '${path}%'"
val sortOrder = MediaStore.Audio.Media.TITLE + " ASC"
val cursor = contentResolver.query(uri, projection, selection, null, sortOrder)
val tempAudioList = arrayListOf<Audio>()
if (cursor != null && cursor.count > 0) {
while (cursor.moveToNext()) {
val data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))
val fileName = data.split(File.separator).let { it[it.size - 1] }
val title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))
val album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM))
val artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))
val duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION))
val albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ID))
// Save to audioList
tempAudioList.add(Audio(data, fileName, title, album, artist, duration, albumId))
}
}
cursor!!.close()
return tempAudioList
}
将Uri返回到文件夹。
问题是:我不再具有指向文件夹的直接文件系统路径,因此当我尝试使用contentResolver.query
查询媒体文件时,我不再能够编写如下选择:
val selection = "${MediaStore.Audio.Media.IS_MUSIC} != 0 AND ${MediaStore.Audio.Media.DATA} LIKE '${path}%'"
因为我再也没有路了。
我切换到使用DocumentFile,但当我尝试在SQL选择子句中使用该Uri时,它就是不起作用。。。
我有一个解决方法,比如:从文档文件中获取文件名,然后尝试在查询和筛选中使用它,方法是${code>${MediaStore.Audio.Media.DISPLAY_NAME}像${NAME},但文件系统可能有几个同名的文件。
有人能告诉我应该怎么做,选择文件夹(就像我现在使用SAF一样,然后可以使用contentResolver.query
查询文件夹中的所有音频以获取其媒体标签吗
此外,如果我在以下位置使用文件夹或其任何子文件的Uri:
contentResolver.query(uri, projection, selection, null, sortOrder)
in不返回我任何媒体标签
现在android不赞成使用文件直接访问,我们被迫…
否。在清单文件中设置一个简单标志,android 10设备的行为与以前一样。对于android 11设备,您只需像以前一样具有文件读取权限。将Uri返回到文件夹。问题是:I No lo您有指向文件夹的直接文件系统路径,…
是的。仔细查看内容方案,您会看到文件夹名称。甚至是完整路径。查询媒体商店时,请使用列。相对路径,而不是Android 10+设备的.DATA。@blackapps 1)是的,但在将来的版本中,清单的标志将被忽略,这就是为什么我决定重新实现这个。2) 是的,我在那里有一些路径,但它与数据不匹配,我最终实现了它:val selection1=“${MediaStore.Audio.Media.IS_MUSIC}!=0和${MediaStore.Audio.Media.data}如“%$${path.parentFile!!.name}${File.separator}${path.name}%”。3) 好的,谢谢,我将查看相对路径,但是在未来的版本中,清单的标志将被忽略,所以这就是我决定重新实现这个
的原因。是的,它只适用于Android 10设备。如果你读过我的第一条评论,你就会知道,除了使用不同的专栏,Android 11设备不需要额外的东西。而且通常是一个不同的集合。现在安卓不赞成使用文件直接访问,我们被迫…
否。在清单文件中设置一个简单标志,安卓10设备的行为与以前一样。对于Android 11设备,您只需像以前一样具有文件读取权限。将Uri返回到文件夹。问题是:我不再有文件夹的直接文件系统路径,…
是的,您有。仔细查看内容方案,您会看到文件夹名称。即使是完整路径。对于Android 10+设备,查询媒体商店时也要使用列.RELATIVE_path,而不是.DATA。@blackapps 1)是的,但清单的标记在未来版本中将被忽略,所以我决定重新实现它。2) 是的,我在那里有一些路径,但它与数据不匹配,我最终实现了它:val selection1=“${MediaStore.Audio.Media.IS_MUSIC}!=0和${MediaStore.Audio.Media.data}如“%$${path.parentFile!!.name}${File.separator}${path.name}%”。3) 好的,谢谢,我将查看相对路径,但是在未来的版本中,清单的标志将被忽略,所以这就是我决定重新实现这个
的原因。是的,它只适用于Android 10设备。如果你读过我的第一条评论,你就会知道,除了使用不同的专栏,Android 11设备不需要额外的东西。而且往往是不同的收藏。
contentResolver.query(uri, projection, selection, null, sortOrder)