Android 如何使用MediaStoreAPI检索歌曲并播放?此外,获取封面艺术,如果可能,读取其输入流?

Android 如何使用MediaStoreAPI检索歌曲并播放?此外,获取封面艺术,如果可能,读取其输入流?,android,kotlin,filenotfoundexception,mediastore,Android,Kotlin,Filenotfoundexception,Mediastore,我得到了一个异常,FileNotFoundException val resolver: ContentResolver = onContextRequest!!.onRequest().contentResolver val mode = "rw" try { val uri = Uri.parse(Stem.get().loadedTrack.data!!.uri)

我得到了一个异常,FileNotFoundException

            val resolver: ContentResolver = onContextRequest!!.onRequest().contentResolver
            val mode = "rw"

            try {

                val uri = Uri.parse(Stem.get().loadedTrack.data!!.uri)

                uri.toast(onContextRequest!!.onRequest())

                resolver.openFileDescriptor(uri, mode).use {

                    player!!.setDataSource(it!!.fileDescriptor)
                }

            } catch (e: IOException) {
                e.printStackTrace()
                "ERROR $e".longToast(onContextRequest!!.onRequest())
            }
错误java.io.FileNotFoundException:无内容提供程序:/internal/audio/
在我可以将数据源设置为文件路径之前,它工作得很好,但这种方法不是最有效的

在android的官方文档中,它说明了如何做到这一点。这就是我正在做的

这些是我声明的所有权限(是的,它们在运行时被授予)


我看不出什么是
外部内容\u URI
。如果您使用的是安卓Q,那么请使用

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
然后构建文件的
ContentUri
like

Uri mediaUri = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
使用此uri启动MediaMetaRetriever以获取albumart

contentUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, _id);
你可以像这样玩这个uri

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
byte[] img = mmr.getEmbeddedPicture();
希望有帮助。 不要忘记设置运行权限


GGK

我没有使用Android Q:'(这是我使用ContentURI.withAppendedId(EXTERNA\u CONTENT\u URI,\u id)时得到的URI)位置URI路径->/external/audio/media/60036这与我用于媒体播放器的路径相同。如果您找不到该文件,则该文件在该位置不存在,或者您没有读取权限。请检查此项。
contentUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, _id);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
byte[] img = mmr.getEmbeddedPicture();
mMediaplayer.setDataSource(mContext, uri);