[英]Android: cannot play a song - java.lang.UnsupportedOperationException: Unknown or unsupported URL
I'm trying to play a song which I put in Music folder on SD card.我正在尝试播放我放在 SD 卡音乐文件夹中的歌曲。 But when I call
mediaPlayer?.setDataSource(this@MusicPlayerActivity, uri)
I get the exception: "java.lang.UnsupportedOperationException: Unknown or unsupported URL: content://media/external/audio/media/samurai.mp3"但是当我调用
mediaPlayer?.setDataSource(this@MusicPlayerActivity, uri)
我得到异常:“java.lang.UnsupportedOperationException: Unknown or unsupported URL: content://media/external/audio/media/samurai.mp3”
I get an URI in the readSongs()
function.我在
readSongs()
function 中得到一个 URI。 Is there any trouble with the URI? URI 有问题吗? If there is, how to get the right URI?
如果有,如何获得正确的 URI?
Thanks.谢谢。
Code snippet代码片段
class MusicPlayerActivity : AppCompatActivity() {
private lateinit var binding: ActivityMusicPlayerBinding
private lateinit var musicList: MutableList<Music>
private lateinit var linearLayoutManager: LinearLayoutManager
private lateinit var adapter: MusicAdapter
private var mediaPlayer: MediaPlayer? = null
private var currentTrackPosition: Int = 0
private var isPlaying: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMusicPlayerBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
musicList = mutableListOf()
if (Build.VERSION.SDK_INT >= 23) {
checkPermissions()
}
binding.playFab.setOnClickListener {
play(currentTrackPosition)
}
}
private fun play(currentTrackPosition: Int) {
if (!isPlaying) {
isPlaying = true
mediaPlayer = MediaPlayer()
mediaPlayer?.setAudioStreamType(AudioManager.STREAM_MUSIC)
try {
val uri = Uri.parse(musicList[currentTrackPosition].songUri)
mediaPlayer?.setDataSource(this@MusicPlayerActivity, uri)
mediaPlayer?.prepare()
mediaPlayer?.start()
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun readSongs() {
val selection = MediaStore.Audio.Media.IS_MUSIC
val projection = arrayOf(
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DISPLAY_NAME
)
val uriExternal = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
val cursor: Cursor? = contentResolver.query(
uriExternal,
projection,
selection,
null, null
)
while (cursor!!.moveToNext()) {
musicList.add(
Music(
cursor.getString(0),
cursor.getString(1),
Uri.withAppendedPath(uriExternal, cursor.getString(2)).toString()
)
)
}
cursor.close()
linearLayoutManager = LinearLayoutManager(this)
adapter = MusicAdapter(musicList)
binding.recyclerView.layoutManager = linearLayoutManager
binding.recyclerView.adapter = adapter
}
I replaced MediaStore.Audio.Media.DISPLAY_NAME
with MediaStore.Audio.Media._ID
so URI becomes "content://media/external/audio/media/42" and now it works!我用
MediaStore.Audio.Media.DISPLAY_NAME
替换了MediaStore.Audio.Media._ID
,因此 URI 变为“content://media/external/audio/media/42”,现在它可以工作了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.