Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从存储访问框架(SAF)接收的具有Uri的Android contentResolver.query_Android_Android File_Android Contentresolver_Android Fileprovider_Android Storage - Fatal编程技术网

从存储访问框架(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)