Questo documento introduce i concetti di base con cui dovresti avere familiarità prima di utilizzare Media Player.
Classi audio e video
Le seguenti classi riproducono audio e video nel framework Android:
MediaPlayer: questa classe è l'API principale per la riproduzione di audio e video.AudioManager: questa classe gestisce le sorgenti audio e l'uscita audio su un dispositivo.
Dichiarazioni manifest
Prima di iniziare lo sviluppo dell'applicazione utilizzando MediaPlayer, assicurati che il file manifest contenga le dichiarazioni appropriate per consentire l'utilizzo delle funzionalità correlate.
Autorizzazione internet: se utilizzi MediaPlayer per lo streaming di contenuti basati sulla rete, la tua applicazione deve richiedere l'accesso alla rete.
<uses-permission android:name="android.permission.INTERNET" />Autorizzazione wakelock: se l'applicazione del player deve impedire che lo schermo si oscuri o che il processore vada in sospensione oppure utilizza i
MediaPlayer.setScreenOnWhilePlaying(boolean)oMediaPlayer.setWakeMode(android.content.Context, int)metodi, devi richiedere questa autorizzazione.<uses-permission android:name="android.permission.WAKE_LOCK" />
Utilizzare la classe MediaPlayer
La MediaPlayer classe è 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 sorgenti multimediali, tra cui:
- Risorse locali
- URI interni, ad esempio uno 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 modo particolare. Tuttavia, il contenuto di questa risorsa non deve essere audio non elaborato. Deve essere un file multimediale codificato e formattato correttamente in uno dei formati supportati.
Ecco come potresti riprodurre da un URI disponibile localmente nel sistema (che hai ottenuto tramite un Content Resolver, ad esempio):
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 è simile alla seguente:
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 il rendimento
Tieni presente il rendimento quando utilizzi MediaPlayer. Ad esempio, la chiamata
a prepare() può richiedere molto tempo per l'esecuzione, perché potrebbe comportare
il recupero e la decodifica dei dati multimediali. Pertanto, come qualsiasi metodo che potrebbe richiedere molto tempo
per l'esecuzione, non chiamarlo mai dal thread dell'interfaccia utente dell'applicazione. In questo modo, l'UI smette di rispondere finché il metodo non restituisce un valore, il che comporta una scarsa esperienza utente 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 notificare il thread principale al termine dell'operazione. Il framework fornisce
un modo pratico per eseguire il prepareAsync() metodo per questa
attività. Questo metodo avvia la preparazione dei contenuti multimediali in background e restituisce immediatamente un valore. Al termine della preparazione dei contenuti multimediali, viene chiamato il onPrepared() metodo
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, all'archiviazione e alla riproduzione di audio e video: