Questo documento illustra i concetti di base che devi conoscere prima di utilizzare Media Player.
Corsi di audio e video
Le seguenti classi riproducono audio e video nel framework Android:
MediaPlayer
: questo è l'API principale per la riproduzione di audio e video.AudioManager
: questo gruppo gestisce le sorgenti audio e l'uscita audio su un dispositivo.
Dichiarazioni manifest
Prima di iniziare a sviluppare l'applicazione utilizzando MediaPlayer, assicurati che il file manifest contenga le dichiarazioni appropriate per consentire l'utilizzo delle funzionalità correlate.
Autorizzazione di accesso a internet:se utilizzi MediaPlayer per riprodurre in streaming contenuti basati sulla rete, la tua applicazione deve richiedere l'accesso alla rete.
<uses-permission android:name="android.permission.INTERNET" />
Autorizzazione Wake Lock: se l'applicazione del player deve impedire l'oscuramento dello schermo o la sospensione del processore oppure utilizza i metodi
MediaPlayer.setScreenOnWhilePlaying(boolean)
oMediaPlayer.setWakeMode(android.content.Context, int)
, devi richiedere questa autorizzazione.<uses-permission android:name="android.permission.WAKE_LOCK" />
Utilizzare la classe MediaPlayer
La classe MediaPlayer
è un componente essenziale del framework multimediale.
Un oggetto di questa classe può recuperare, decodificare e riprodurre sia audio che video con una configurazione minima. MediaPlayer
supporta diverse fonti media, tra cui:
- Risorse locali
- URI interni, ad esempio quelli che potresti ottenere da un Content Resolver
- URL esterni (streaming)
Per un elenco dei formati multimediali supportati da Android, consulta la pagina Formati multimediali supportati.
Esempi di utilizzo delle sorgenti audio
Ecco un esempio di come riprodurre l'audio disponibile come risorsa non elaborata locale
(salvata nella directory res/raw/
dell'applicazione):
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
In questo caso, una risorsa "non elaborata" è un file che il sistema non tenta di analizzare in alcun modo particolare. Tuttavia, i contenuti di questa risorsa non devono essere audio non elaborato. Deve essere un file multimediale codificato e formattato correttamente in uno dei formati supportati.
Ecco come riprodurre contenuti da un URI disponibile localmente nel sistema (ad esempio ottenuto tramite un Content Resolver):
Kotlin
val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}
Java
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
La riproduzione da un URL remoto utilizzando lo streaming HTTP ha il seguente aspetto:
Kotlin
val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
Java
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
Utilizzare la preparazione asincrona per migliorare le prestazioni
Tieni presente il rendimento quando utilizzi MediaPlayer
. Ad esempio, l'esecuzione della chiamata
a prepare()
può richiedere molto tempo, perché potrebbe comportare
il recupero e la decodifica dei dati multimediali. Pertanto, come per qualsiasi metodo che potrebbe richiedere molto tempo per l'esecuzione, non chiamarlo mai dal thread dell'interfaccia utente dell'applicazione. In questo modo,
l'interfaccia utente smette di rispondere finché il metodo non restituisce un valore, il che rappresenta un'esperienza utente negativa e può causare un errore ANR (L'applicazione non risponde).
Per evitare di bloccare il thread dell'interfaccia utente, genera un altro thread per preparare il
MediaPlayer
e notifica il thread principale al termine. Il framework fornisce un modo pratico per eseguire il metodo prepareAsync()
per svolgere questa attività. Questo metodo avvia la preparazione dei contenuti multimediali in background e restituisce immediatamente il risultato. Al termine della preparazione dei contenuti multimediali, viene chiamato il metodo onPrepared()
di MediaPlayer.OnPreparedListener
, configurato tramite setOnPreparedListener()
.
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, allo stoccaggio e alla riproduzione di audio e video: