Questo documento tratta due aree con potenziali insidie.
Stato. Con "Medialayer", alcune operazioni sono valide solo in stati specifici. Operazioni errate possono causare eccezioni o comportamenti imprevisti.
Risorse. Quando apporti modifiche alla configurazione, ad esempio la rotazione dello schermo, devi rilasciare un oggetto
MediaPlayerper liberare le risorse di sistema ed evitare l'esaurimento delle risorse.
Gestire lo stato
MediaPlayer è basato sullo stato. Ovvero, ha uno stato interno di cui devi sempre essere a conoscenza quando scrivi il codice, perché alcune operazioni sono valide solo quando il player si trova in stati specifici. Se esegui un'operazione nello stato errato, il sistema potrebbe generare un'eccezione o causare altri comportamenti indesiderati.
Il diagramma di stato nella documentazione della classe MediaPlayer chiarisce
quali metodi spostano MediaPlayer da uno stato
all'altro. Ad esempio:
- Quando crei un nuovo
MediaPlayer, si trova nello stato Idle. - Lo inizializzi chiamando
setDataSource(), che lo porta allo stato Initialized. - Lo prepari utilizzando il metodo
prepare()oprepareAsync(). - Quando il
MediaPlayerha terminato la preparazione, entra nello statoPrepared, il che significa che puoi chiamarestart()per riprodurre i contenuti multimediali.
A questo punto, come illustrato nel diagramma, puoi passare dagli stati Started,
Paused e PlaybackCompleted chiamando metodi come
start(), pause() e seekTo(), tra gli altri.
Quando chiami stop(), tieni presente che non puoi chiamare di nuovo start()
finché non prepari di nuovo MediaPlayer.
Tieni sempre presente il diagramma di stato quando scrivi codice che interagisce con
un oggetto MediaPlayer, perché la chiamata dei suoi metodi dallo stato errato è
una causa comune di bug.
Rilasciare MediaPlayer
Un MediaPlayer può consumare risorse di sistema preziose. Pertanto, devi sempre adottare precauzioni aggiuntive per assicurarti di non mantenere un'
MediaPlayer istanza più a lungo del necessario. Al termine,
devi sempre chiamare release() per assicurarti che tutte le risorse di sistema
allocate vengano rilasciate correttamente.
Ad esempio, se utilizzi un MediaPlayer e la tua attività riceve una
chiamata a onStop(), devi rilasciare MediaPlayer, perché ha
poco senso mantenerlo mentre la tua attività non interagisce con
l'utente (a meno che tu non stia riproducendo contenuti multimediali in background, argomento trattato nella
sezione successiva).
Quando l'attività viene ripresa o riavviata, ovviamente, devi creare un nuovo
MediaPlayer e prepararlo di nuovo prima di riprendere la riproduzione.
Ecco come rilasciare e poi impostare su null MediaPlayer:
Kotlin
mediaPlayer?.release()
mediaPlayer = null
Java
mediaPlayer.release();
mediaPlayer = null;
Ad esempio, considera i problemi che si verificano se dimentichi di rilasciare il
MediaPlayer quando l'attività si interrompe, ma ne crei uno nuovo quando l'
attività riprende. Quando l'utente modifica l'orientamento dello schermo (o modifica la configurazione del dispositivo in un altro modo), il sistema riavvia l'attività per impostazione predefinita. Potresti consumare rapidamente tutte le risorse di sistema mentre l'utente
ruota il dispositivo avanti e indietro tra verticale e orizzontale, perché a
ogni cambio di orientamento crei un nuovo MediaPlayer che non
rilasci mai.
Per ulteriori informazioni sui riavvii di runtime, vedi Gestire le modifiche di runtime.
Ti starai chiedendo cosa succede se vuoi continuare a riprodurre "contenuti multimediali in background" anche quando l'utente esce dalla tua attività, proprio come si comporta l'applicazione Musica integrata. In questo caso, ti serve un
MediaPlayer controllato da un servizio, come descritto nella sezione successiva.
Scopri di più
Jetpack Media3 è la soluzione consigliata per la riproduzione di contenuti multimediali nella tua app. Scopri di più.
Queste pagine trattano argomenti relativi alla registrazione, all'archiviazione e alla riproduzione di audio e video: