[英]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.