#android #android-studio #kotlin #mvvm #exoplayer
Вопрос:
Я пытаюсь воспроизвести список песен, основанный на текущем фрагменте.
Например
- В Allsongfragment — Воспроизводите и ставьте в очередь все песни с пользовательского устройства
- В избранных песнях — Только воспроизведение и список очередей песен, добавленных пользователем в избранное
- В Artistesongfragent — Только воспроизведение и список очередей песен этого исполнителя.
Я могу воспроизводить песни, но мне трудно сформировать очередь из списка песен на основе фрагмента, который был воспроизведен
Что я и пытался.
Когда пользователь нажимает «воспроизвести песню» в любом фрагменте, например:
FavoriteSongsFragment
favouriteSongsAdapter.setOnItemClickListener {
//Played from FavoriteSongsFragment, now save in preference
PreferenceHelper.storeQueue = Constants.QUEUE_FAV_SONGS
//ViewModel for playing song with the queue passed as parameter
mainViewModel.playOrToggleSong(it, queue = PreferenceHelper.storeQueue)
}
Mainviewмодель
fun playOrToggleSong(mediaItem: Songs, toggle: Boolean = false, queue: String? = PreferenceHelper.storeQueue)
{
val isPrepared = playBackState.value?.isPrepared ?: false
if (isPrepared amp;amp; mediaItem.mediaId.toString() == currentlyPlayingSong.value?.getString(METADATA_KEY_MEDIA_ID)){
playBackState.value?.let { playbackState ->
when{
playbackState.isPlaying -> if (toggle) musicServiceConnection.transportControls.pause()
playbackState.isPlayEnabled -> musicServiceConnection.transportControls.play()
}
}
}
else{
musicServiceConnection.transportControls.playFromMediaId(mediaItem.mediaId.toString(), null)
}
}
Музыкальный источник
var songs = emptyList<MediaMetadataCompat>()
var allSongs: List<Songs>? = null
suspend fun fetchMediaData() = withContext(Dispatchers.IO){
state = State.STATE_INITIALIZING
val permissionGranted = ContextCompat.checkSelfPermission(context,
Manifest.permission.READ_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED
if (permissionGranted){
//check which fragment was played and pass the list of songs to be queued
if (PreferenceHelper.storeQueue == Constants.QUEUE_ALL_SONGS){
allSongs = musicDatabase.getContentProviderValue()
}
else if (PreferenceHelper.storeQueue == Constants.QUEUE_ARTISTE_SONGS){
allSongs = artisteDatabase.getArtisteSongs(191)
}
songs = allSongs!!.map { song ->
Builder()
.putString(METADATA_KEY_ARTIST, song.subtitle.toString())
.putString(METADATA_KEY_MEDIA_ID, song.mediaId.toString())
.putString(METADATA_KEY_TITLE, song.title.toString())
.putString(METADATA_KEY_GENRE, song.genre.toString())
.putString(METADATA_KEY_ALBUM, song.album.toString())
.putString(METADATA_KEY_DATE, song.dateAdded.toString())
.build()
}
state = State.STATE_INITIALIZED
}
}
Currently, when I play a song, the preference is saved and the queue only takes effect after I close and reopen the app.
E.g
When I play a song in ArtisteSongsFragment, the queue doesnt take effect that moment, only when I close and open the app…then when I now play a song from AllSongsFragment, it gives the queue for songs in ArtisteSongsFragment which was saved before.