Hello so this is my first project with android and with Media 3 API , I'm using media session with the foreground service, I'm setting up the mediaController in the viewmodel ,I'm trying to return what I've cached from the player, but there's one problem , that why is mediacontroller is null in cases and in some cases it's not , here's my full code
Here's my viewmodel
@HiltViewModel
class PlayerViewModel @Inject constructor(
private val mediaControllerFuture: Listener
...
) : 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()
}
< /code>
Надеюсь, кто -то поможет мне в этом, я не знаю, даже если ViewModels - это правильный способ создания контроллера медиа, я новичок в Android, спасибо < /p>
Я подумал, что проблема в Player.url < /code> Сначала он возвращался
/storage/emulated/0/Android/data/com.mostaqem/files/Download/179.mp3
я попробовал добавить файл: // , так что это может быть URI, но не работал, хотя он работает, когда я даю ему http URL при использовании онлайн, но он не работает в состоянии init,
Я ожидал>
Hello so this is my first project with android and with Media 3 API , I'm using media session with the foreground service, I'm setting up the mediaController in the viewmodel ,I'm trying to return what I've cached from the player, but there's one problem , that why is mediacontroller is null in cases and in some cases it's not , here's my full code Here's my viewmodel [code]@HiltViewModel class PlayerViewModel @Inject constructor( private val mediaControllerFuture: Listener ... ) : 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() {
}, 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() } < /code> Надеюсь, кто -то поможет мне в этом, я не знаю, даже если ViewModels - это правильный способ создания контроллера медиа, я новичок в Android, спасибо < /p> Я подумал, что проблема в Player.url < /code> Сначала он возвращался /storage/emulated/0/Android/data/com.mostaqem/files/Download/179.mp3[/code] я попробовал добавить файл: // , так что это может быть URI, но не работал, хотя он работает, когда я даю ему http URL при использовании онлайн, но он не работает в состоянии init, Я ожидал>
Привет, так что это мой первый проект с Android и с Media 3 API, я использую сеанс медиа с службой переднего плана, я настраиваю медиаконтроллер в ViewModel, я пытаюсь вернуть то, что я Кэшируется от игрока, но есть одна проблема, что почему...
Привет, так что это мой первый проект с Android и с Media 3 API, я использую сеанс медиа с службой переднего плана, я настраиваю медиаконтроллер в ViewModel, я пытаюсь вернуть то, что я Кэшируется от игрока, но есть одна проблема, что почему...
Привет, так что это мой первый проект с Android и с Media 3 API, я использую сеанс медиа с службой переднего плана, я настраиваю медиаконтроллер в ViewModel, я пытаюсь вернуть то, что я Кэшируется от игрока, но есть одна проблема, что почему...
Я создал PlayerService, который наследует MediaSessionService, а также имеет MediaSession.Callback(), как предложено в документации Android Media3.
Теперь, чтобы обновить пользовательский интерфейс на основе PlayerService, Я создал MediaController,...
Я пробовал отправлять смс по этой ссылке
но проблема в том, что она всегда выдает «сообщение отправлено»
как узнать, действительно ли сообщение отправлено!