Вот мой ViewModel
Код: Выделить всё
@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>
Вот моя настройка MediaController < /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>
Вот где 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>
Вот мой getmediaitem, который в основном устанавливает метаданные и возвращает MediaItem, чтобы я мог использовать его для контроллера медиа < /p>
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()
}
Я думал, что проблема в Player.url < /code> В первом она возвращалась
Код: Выделить всё
/storage/emulated/0/Android/data/com.mostaqem/files/Download/179.mp3
Я ожидал, что MediaController установит и подготовит медиаитем, но нет, он не установил и не подготовил медиайтемом, так как MediaController - это null
Подробнее здесь: https://stackoverflow.com/questions/794 ... some-cases