簡體   English   中英

如何防止在我的音樂播放器應用程序中同時播放多首歌曲?

[英]How do i prevent playing multiple songs at the same time in my music player app?

我正在嘗試構建一個音樂播放器應用程序,當我嘗試播放另一首歌曲時遇到問題,而一首歌曲已經在播放。 我希望我的應用程序停止播放已經運行的歌曲並開始播放新歌曲。 我將歌曲的詳細信息作為一個包從適配器類中提取到我的 SongPlayingFragment 中。 我嘗試實現 pause()、stop() 和 release() 方法。 但他們都沒有工作。 我相信我在錯誤的代碼部分實現了它們。 這是我的代碼,沒有實現上述任何方法。 解決這個問題會有很大幫助。 謝謝你。

歌曲播放片段代碼

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    audioManager = myActivity?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
    favouriteContent = EchoDatabase(myActivity)

    currentSongHelper = CurrentSongHelper()
    currentSongHelper?.isPlaying = true
    currentSongHelper?.isLoop = false
    currentSongHelper?.isShuffle = false

    var path:String?=null
    var songTitle:String?=null
    var songArtist:String?=null
    var songId:Long = 0

    try
    {
       path = arguments?.getString("path")
       songTitle = arguments?.getString("songTitle")
       songArtist = arguments?.getString("songArtist")
       songId = arguments?.getInt("songId")?.toLong() as Long
       currentPosition = arguments?.getInt("songPosition") as Int
       fetchSongs = arguments?.getParcelableArrayList("songData")

        currentSongHelper?.songPath = path
        currentSongHelper?.songTitle = songTitle
        currentSongHelper?.songArtist = songArtist
        currentSongHelper?.songId = songId
        currentSongHelper?.currentPosition = currentPosition

        updateTextViews(currentSongHelper?.songTitle as String,currentSongHelper?.songArtist as String)
    }
    catch (e:Exception)
    {e.printStackTrace()}
    mediaPlayer = MediaPlayer()
    mediaPlayer?.setAudioStreamType(AudioManager.STREAM_MUSIC)
    try
    {
        mediaPlayer?.setDataSource(myActivity, Uri.parse(path))
        mediaPlayer?.prepare()
    }
    catch(e:Exception)
    {e.printStackTrace()}

    mediaPlayer?.start()
    processInformation(mediaPlayer as MediaPlayer)



    if(currentSongHelper?.isPlaying as Boolean)
    {
        playPauseButton?.setBackgroundResource(R.drawable.pause_icon)
    }
    else
    {
        playPauseButton?.setBackgroundResource(R.drawable.play_icon)
    }
    mediaPlayer?.setOnCompletionListener {
        songOnComplete()
    }

和我的適配器類

package com.musicplayer.echo.adapters

類 MainScreenAdapter(arrayList:ArrayList, _context : Context): RecyclerView.Adapter() {

var songDetails:ArrayList<Songs>?=null
var mContext: Context?=null

init
{
    this.songDetails = arrayList
    this.mContext = _context
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder
{
     val itemView = LayoutInflater.from(parent?.context)
             .inflate(R.layout.row_custom_mainscreen,parent,false)

    return MyViewHolder(itemView)
}

override fun getItemCount(): Int
{
    if(songDetails==null)
        return 0
    else
        return (songDetails as ArrayList<Songs>).size
}

override fun onBindViewHolder(holder: MyViewHolder, position: Int)
{
     val songObject = songDetails?.get(position)
     holder.trackTitle?.text = songObject?.songTitle
     holder.trackArtist?.text = songObject?.songArtist
     holder.contentHolder?.setOnClickListener({

         val songPlayingFragment = SongPlayingFragment()
         var args = Bundle()
         args.putString("songArtist",songObject?.songArtist)
         args.putString("songTitle",songObject?.songTitle)
         args.putString("path",songObject?.songData)
         args.putInt("songId",songObject?.songId?.toInt() as Int)
         args.putInt("songPosition",position)
         args.putParcelableArrayList("songData",songDetails)
         songPlayingFragment.arguments = args
         (mContext as FragmentActivity).supportFragmentManager
                 .beginTransaction()
                 .replace(R.id.details_fragment, songPlayingFragment)
                 .commit()
     })
}
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view)
{
    var trackTitle : TextView?=null
    var trackArtist : TextView?=null
    var contentHolder : RelativeLayout?=null

    init
    {
        trackTitle = view.findViewById(R.id.trackTitle)
        trackArtist = view.findViewById(R.id.trackArtist)
        contentHolder = view.findViewById(R.id.contentRow)
    }
}

}

只需重置媒體播放器的狀態然后播放另一首歌曲,這是一個示例:

  /**
   * release media player
   */
  private fun reset() {
    stopUpdatePosition()
    mediaPlayer?.isPlaying?.run { mediaPlayer?.stop() }
    mediaPlayer?.reset()
    mediaPlayer = null
  }

  private fun play(source: String) {
      mediaPlayer = MediaPlayer()
      mediaPlayer?.run {
      isLooping = isRepeatOne
      setOnPreparedListener(this@AudioPlayerService)
      setOnCompletionListener(this@AudioPlayerService)

      // must prepare in another thread
      setDataSource(source)
      prepareAsync()
    }
  }

  reset()
  // source ~ http://xxxx.mp3
  play(source)

暫無
暫無

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

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