Hallo, dies ist mein erstes Projekt mit Android und mit Media 3 API. Ich verwende Mediensitzung mit dem Vordergrunddienst. Ich stelle den MediaController im ViewModel ein. />
@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>
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()
}
< /code>
Ich hoffe, jemand hilft mir dabei. Ich weiß nicht, selbst wenn ViewModels die richtige Möglichkeit ist, den Media Controller zu erstellen. Ich bin neu in Android. Danke < /p>
Ich dachte/storage/emulated/0/Android/data/com.mostaqem/files/Download/179.mp3
Ich habe versucht, Datei hinzugefügt: // Es kann also ein URI sein, aber es funktioniert nicht, obwohl es funktioniert, wenn ich ihm eine HTTP -URL bei der Verwendung eines Online -Verwendung>
Hallo, dies ist mein erstes Projekt mit Android und mit Media 3 API. Ich verwende Mediensitzung mit dem Vordergrunddienst. Ich stelle den MediaController im ViewModel ein. /> [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> Hier ist mein MediaController-Setup < /p> private fun setupMediaController() {
}, 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() } < /code> Ich hoffe, jemand hilft mir dabei. Ich weiß nicht, selbst wenn ViewModels die richtige Möglichkeit ist, den Media Controller zu erstellen. Ich bin neu in Android. Danke < /p> Ich dachte/storage/emulated/0/Android/data/com.mostaqem/files/Download/179.mp3[/code] Ich habe versucht, Datei hinzugefügt: // Es kann also ein URI sein, aber es funktioniert nicht, obwohl es funktioniert, wenn ich ihm eine HTTP -URL bei der Verwendung eines Online -Verwendung>
Hallo also, dies ist mein erstes Projekt mit Android und mit Media 3 API. Ich verwende Mediensitzung mit dem Vordergrunddienst. Ich richte den MediaController im ViewModel ein. Ich versuche...
Ich habe ein Python-Skript, das eine Reihe von CasperJS-Aufgaben verwaltet und das Ergebnis verarbeitet. Es läuft gut über die Befehlszeile, aber wenn ich das Skript in Cron ausführe, erhalte ich die...
Ich habe Multiselect implementiert und kann Optionen auf der linken Seite auswählen und auf die rechte Seite verschieben.
Wenn ich versuche, die ausgewählten Optionen im Javascript mithilfe von var...
Ich habe Multiselect implementiert und kann Optionen auf der linken Seite auswählen und auf die rechte Seite verschieben.
Wenn ich versuche, die ausgewählten Optionen im Javascript mithilfe von var...