簡體   English   中英

Android:無法播放歌曲 - java.lang.UnsupportedOperationException:未知或不支持 URL

[英]Android: cannot play a song - java.lang.UnsupportedOperationException: Unknown or unsupported URL

我正在嘗試播放我放在 SD 卡音樂文件夾中的歌曲。 但是當我調用mediaPlayer?.setDataSource(this@MusicPlayerActivity, uri)我得到異常:“java.lang.UnsupportedOperationException: Unknown or unsupported URL: content://media/external/audio/media/samurai.mp3”

我在readSongs() function 中得到一個 URI。 URI 有問題嗎? 如果有,如何獲得正確的 URI?

謝謝。

代碼片段

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
    }

我用MediaStore.Audio.Media.DISPLAY_NAME替換了MediaStore.Audio.Media._ID ,因此 URI 變為“content://media/external/audio/media/42”,現在它可以工作了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM