Code: Select all
@HiltViewModel
class PlayerViewModel @Inject constructor(
...
) : ViewModel() {
private var mediaController: MediaController? = null
val playerState = mutableStateOf(PlayerSurah(reciter = defaultReciter))
init {
viewModelScope.launch(errorHandler) {
if (playerState.value.isLocal) {
restoreCachedState()
if (isCached) {
applyCachedState()
}
} else {
networkObserver.observe().collect {
if (it == NetworkStatus.Available) {
restoreCachedState()
if (isCached) {
applyCachedState()
}
}
}
}
}
setupMediaController()
}
< /code>
Hier ist mein MediaController-Setup < /p>
private fun setupMediaController() {
mediaControllerFuture.addListener(
{
mediaController = mediaControllerFuture.get().apply {
addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
...
}
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
...
super.onMediaItemTransition(mediaItem, reason)
}
}, MoreExecutors.directExecutor()
)
}
< /code>
Hier ist MediaController null < /p>
private fun applyCachedState() {
val player = playerState.value
if (player.surah != null) {
if (!player.isLocal) { //Online Mode
// WORKS HERE
viewModelScope.launch {
val metadataData = getMediaURL(
surahID = player.surah.id,
reciterID = player.reciter.id,
recitationID = player.recitationID
)
val metadata = getMediaItem(metadataData)
mediaController?.setMediaItem(metadata, player.position) // IT's NOT NULL HERE
mediaController?.prepare() // It's NOT NULL HERE
}
}
if (player.isLocal) { // Offline Mode
// DOESN"T WORK HERE
val data = AudioData(
url = player.url!!, //file:///storage/emulated/0/Android/data/com.mostaqem/files/Download/179.mp3
surah = player.surah,
recitationID = player.recitationID!!,
recitation = RecitationData(
reciter = player.reciter,
id = player.recitationID,
englishName = player.reciter.englishName,
reciterID = player.reciter.id,
name = ""
),
)
val mediaItem = getMediaItem(data)
mediaController?.setMediaItem(mediaItem) // IT'S NULL HERE So it doesnt work
mediaController?.prepare() // IT'S NULL HERE so it doesnt work
}
}
}
< /code>
Hier ist mein GetMediaItem, der Metadaten im Grunde genommen festgelegt und MediaItem zurückgibt, damit ich es für Mediencontroller verwenden kann. private fun getMediaItem(data: AudioData): MediaItem {
val surahName = data.surah.arabicName
val reciterName = data.recitation.reciter.arabicName
val metadata: MediaMetadata =
MediaMetadata.Builder().setTitle(surahName).setGenre(data.recitation.id.toString())
.setAlbumTitle(data.recitation.reciter.id.toString())
.setAlbumArtist(data.recitation.reciter.image).setArtist(reciterName)
.setArtworkUri(data.surah.image.toUri()).build()
return MediaItem.Builder().setUri(data.url.toUri()).setMediaMetadata(metadata)
.setMediaId(data.surah.id.toString()).build()
}
Ich dachte, das Problem liegt im Player.
Code: Select all
/storage/emulated/0/Android/data/com.mostaqem/files/Download/179.mp3
Ich erwartete, dass der MediaController das MediaItem festgelegt und vorbereitet hat, aber es ist kein festgelegter MediaItem, da MediaController null