<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=PDM_Avanzado_Reproduci%C3%B3n_de_Audio</id>
	<title>PDM Avanzado Reprodución de Audio - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=PDM_Avanzado_Reproduci%C3%B3n_de_Audio"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_Reproduci%C3%B3n_de_Audio&amp;action=history"/>
	<updated>2026-10-21T13:57:41Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_Reproduci%C3%B3n_de_Audio&amp;diff=57519&amp;oldid=prev</id>
		<title>Angelfg: /* Reproducir música */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_Reproduci%C3%B3n_de_Audio&amp;diff=57519&amp;oldid=prev"/>
		<updated>2015-10-22T14:39:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Reproducir música&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Introdución==&lt;br /&gt;
&lt;br /&gt;
No caso da reprodución do audio, teremos que facer uso das clases &amp;#039;&amp;#039;&amp;#039;MediaPlayer&amp;#039;&amp;#039;&amp;#039; e &amp;#039;&amp;#039;&amp;#039;AudioManager&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Clase utilizadas:&lt;br /&gt;
[http://developer.android.com/reference/android/media/MediaPlayer.html MediaPlayer]: esta clase é a principal utilizada para reproducir audio – vídeo.&lt;br /&gt;
[http://developer.android.com/reference/android/media/AudioManager.html AudioManager]: manexa fontes de audio e gravacións de audio en dispositivos. Nesta parte só imos utilizala para indicar o tipo de audio.&lt;br /&gt;
&lt;br /&gt;
Permisos necesarios a engadir no arquivo AndroidManifest.xml (nos imos engadir todos):&lt;br /&gt;
&lt;br /&gt;
* Se o dispositivo necesita conexión a internet (para escoitar música en streaming, por exemplo) temos que engadir o permiso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Permiso Wake-Lock: no momento no que o S.O. non vexa ‘movemento’ no dispositivo (ou sexa uso) pasará a un estado de modo suspendido. Se queremos que a nosa activity non entre en dito estado podemos facer uso do método MediaPlayer.setWakeMode() e polo tanto necesitaremos o permiso wake_lock:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.WAKE_LOCK&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Permiso de escritura na SD Card: Para ter acceso á memoria externa teremos que especificar no arquivo AndroidManifest.xml que a nosa aplicación necesita permiso de lectura/escritura en dicha memoria.&lt;br /&gt;
&lt;br /&gt;
:*Se imos ler na tarxeta SD:&lt;br /&gt;
::* Se a versión do S.O. Android é inferior á 4.1 non precisamos ningún permiso.&lt;br /&gt;
::* Se a versión do S.O. Android é superior ou igual á 4.1 debemos engadir o permiso: &amp;#039;&amp;#039;&amp;#039;&amp;lt;uses-permission android:name=&amp;quot;android.permission.READ_EXTERNAL_STORAGE&amp;quot;/&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:* Se imos escribir na tarxeta SD:&lt;br /&gt;
::* Se a versión do S.O. Android é inferior á 4.4 o permiso é: &amp;#039;&amp;#039;&amp;#039;&amp;lt;uses-permission android:name=&amp;quot;android.permission.WRITE_EXTERNAL_STORAGE&amp;quot;/&amp;gt; &amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
::* Se a versión do S.O. Android é a 4.4 ou superior. Podemos poñer o mesmo permiso anterior pero as aplicacións dispoñen dun cartafol para escribir na SD (cartafol Android/data/paquete/) sen necesidade de ter o permiso anterior.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.WRITE_EXTERNAL_STORAGE&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; se queremos ter unha música de fondo na nosa aplicación o máis lóxico sería ter un servizo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para engadir ditos permisos de forma gráfica, nos abrimos o arquivo &amp;#039;&amp;#039;&amp;#039;AndroidManifest.xml&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Proceso para engadir permisos de forma gráfica&amp;quot; widths=&amp;quot;350&amp;quot; heights=&amp;quot;350px&amp;quot; perrow=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Image:PDM_Avanzada_Multimedia_Reprod_01.jpg | Prememos a pestana ‘Permissions’ e prememos o botón Add.&lt;br /&gt;
Image:PDM_Avanzada_Multimedia_Reprod_02.jpg| Escollemos a opción &amp;#039;&amp;#039;&amp;#039;Uses Permission&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
Image:PDM_Avanzada_Multimedia_Reprod_03.jpg| Graficamente escollemos os permisos que necesitemos.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MediaPlayer==&lt;br /&gt;
&lt;br /&gt;
Os recursos (arquivos de audio) que podemos utilizar con esta clase poden ser:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Locais&amp;#039;&amp;#039;&amp;#039;: arquivos locais gardados no cartafol /res/raw/ (deberemos crear o cartafol /raw/ se non existe).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;URIs internas&amp;#039;&amp;#039;&amp;#039;: unha URI é unha forma de identificar de forma unívoca un recurso (neste caso multimedia). Podemos referenciar arquivos multimedia gardados nas diferentes tarxetas de memoria do dispositivo.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;URL Externos (streaming)&amp;#039;&amp;#039;&amp;#039;: arquivos multimedia que se atopan en Internet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podedes consultar a lista de formatos de audio – vídeo soportados en http://developer.android.com/guide/appendix/media-formats.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Imos facer unha pequena práctica na que imos reproducir un arquivo multimedia.&lt;br /&gt;
Creamos no proxecto de Android - Multimedia un cartafol de nome ‘raw’ dentro do cartafol /res/ do proxecto:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reproducir música===&lt;br /&gt;
&lt;br /&gt;
Para cargar un arquivo de audio temos que seguir os seguintes pasos:&lt;br /&gt;
&lt;br /&gt;
* Crear un obxecto da clase MediaPlayer.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	private  MediaPlayer mediaplayer;&lt;br /&gt;
        .............&lt;br /&gt;
        mediaplayer = new MediaPlayer();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Chamar ao método &amp;#039;&amp;#039;&amp;#039;setDataSource&amp;#039;&amp;#039;&amp;#039; que queiramos (pode dar lugar a varios tipos de excepcións, polo que teremos que usar try catch para cada tipo delas ou ben capturalos cunha clase &amp;#039;&amp;#039;&amp;#039;Exception&amp;#039;&amp;#039;&amp;#039; aínda que esta forma non é a recomendada). &lt;br /&gt;
:No exemplo usamos &amp;#039;&amp;#039;&amp;#039;Exception&amp;#039;&amp;#039;&amp;#039; para simplificar o código xa que se non teríamos que ter isto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
			try {&lt;br /&gt;
				mediaplayer.setDataSource(path);&lt;br /&gt;
			} catch (IllegalArgumentException e) {&lt;br /&gt;
				// TODO Auto-generated catch block&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} catch (SecurityException e) {&lt;br /&gt;
				// TODO Auto-generated catch block&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} catch (IllegalStateException e) {&lt;br /&gt;
				// TODO Auto-generated catch block&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				// TODO Auto-generated catch block&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Con este método indicamos de onde imos a cargar o audio.&lt;br /&gt;
&lt;br /&gt;
Podemos ter varias posibilidades:&lt;br /&gt;
&lt;br /&gt;
:* O arquivo se atopa en /res/raw:&lt;br /&gt;
::&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;4&amp;quot; &amp;gt;&lt;br /&gt;
        MediaPlayer mediaplayer = new MediaPlayer();&lt;br /&gt;
        Uri uri = Uri.parse(&amp;quot;android.resource://&amp;quot; + getPackageName()+ &amp;quot;/&amp;quot; + R.raw.snowflake_persephone);&lt;br /&gt;
        try {&lt;br /&gt;
         		mediaplayer.setDataSource(getApplicationContext(), uri);&lt;br /&gt;
                        .....&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* O arquivo provén da tarxeta SD.&lt;br /&gt;
:: Temos varias opcións:&lt;br /&gt;
:::&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;4&amp;quot; &amp;gt;&lt;br /&gt;
MediaPlayer mediaplayer = new MediaPlayer();&lt;br /&gt;
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + &amp;quot;snowflake_persephone.mp3&amp;quot;;&lt;br /&gt;
try {&lt;br /&gt;
	mediaplayer.setDataSource(path);&lt;br /&gt;
        .....&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:::&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;5&amp;quot; &amp;gt;&lt;br /&gt;
MediaPlayer mediaplayer = new MediaPlayer();&lt;br /&gt;
String path =Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + &amp;quot;snowflake_persephone.mp3&amp;quot;;&lt;br /&gt;
Uri uri = Uri.parse(Uri.encode(path));        	&lt;br /&gt;
try {&lt;br /&gt;
	mediaplayer.setDataSource(getApplicationContext(),uri);&lt;br /&gt;
        .....&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* O arquivo provén de Internet (música en Streaming).&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Se estades a utilizar un dispositivo real ten que ter conexión a Internet para que funcione.&lt;br /&gt;
:: Temos varias opcións:&lt;br /&gt;
:::&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;4&amp;quot; &amp;gt;&lt;br /&gt;
MediaPlayer mediaplayer = new MediaPlayer();&lt;br /&gt;
String url=&amp;quot;http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3&amp;quot;;&lt;br /&gt;
try {&lt;br /&gt;
	mediaplayer.setDataSource(url);&lt;br /&gt;
        .....&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pode suceder que a dirección da URL teña espazos en branco ou caracteres especiais. Nese caso teremos que &amp;#039;codificar&amp;#039; antes a url a partires do último carácter &amp;#039;/&amp;#039;: &lt;br /&gt;
:::&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;4,6&amp;quot; &amp;gt;&lt;br /&gt;
MediaPlayer mediaplayer = new MediaPlayer();&lt;br /&gt;
String url=&amp;quot;http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3&amp;quot;;&lt;br /&gt;
int pos = url.lastIndexOf(&amp;#039;/&amp;#039;) + 1;&lt;br /&gt;
Uri uri = Uri.parse(url.substring(0, pos) + Uri.encode(url.substring(pos)));&lt;br /&gt;
try {&lt;br /&gt;
	mediaplayer.setDataSource(getApplicationContext(),uri);&lt;br /&gt;
        .....&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Chamar ao método &amp;#039;&amp;#039;&amp;#039;setAudioStreamType(AudioManager.STREAM_MUSIC)&amp;#039;&amp;#039;&amp;#039; para indicarlle que o que imos reproducir será música e poñerá o volume que teña o S.O.  (lembrar que en Android podemos cambiar o volume da música, notificacións e alarmas).&lt;br /&gt;
* Chamar ao método &amp;#039;&amp;#039;&amp;#039;prepare&amp;#039;&amp;#039;&amp;#039; (pode  lanzar unha excepción IOException).&lt;br /&gt;
* Chamar ao método &amp;#039;&amp;#039;&amp;#039;start&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Todos estes pasos son necesarios facelos nesta orde xa que o MediaPlayer vai pasar por unha serie de &amp;#039;&amp;#039;&amp;#039;estados&amp;#039;&amp;#039;&amp;#039; que nos van obrigar a poder facer só unha accións determinadas dependendo do estado no que nos atopemos.&lt;br /&gt;
&lt;br /&gt;
Vexamos o diagrama de estados do MediaPlayer:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Multimedia_Reprod_07.jpg | 400px |center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Gráfico obtido dende http://developer.android.com/reference/android/media/MediaPlayer.html&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Imos analizar dito diagrama.&lt;br /&gt;
&lt;br /&gt;
Cando instanciamos o MediaPlayer (facemos o new) nos situamos no &amp;#039;&amp;#039;&amp;#039;estado idle&amp;#039;&amp;#039;&amp;#039;. Dende dito estado so podemos pasar o &amp;#039;&amp;#039;&amp;#039;estado initialized&amp;#039;&amp;#039;&amp;#039; chamando o método setDataSource.&lt;br /&gt;
&lt;br /&gt;
Se intentemos chamar a outro método (coma start(),...) daranos unha excepción (IlegalStateException).&lt;br /&gt;
Cando estamos a tocar unha canción non podemos cambiar por outra, xa que aínda que chamemos o método stop e pasemos o &amp;#039;&amp;#039;&amp;#039;estado de stop&amp;#039;&amp;#039;&amp;#039;, dende dito estado non podemos chamar ao método setDataSource (mirar diagrama).&lt;br /&gt;
&lt;br /&gt;
A única forma de cambiar de canción será chamando ao método reset(), que volve ao estado Idle como amosamos neste anaco do diagrama anterior:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Multimedia_Reprod_08.jpg | 300px |center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
Podemos cargar un arquivo de audio sen facer os pasos anteriores da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
        MediaPlayer mediaPlayer=MediaPlayer.create(this, R.raw.snowflake_persephone);&lt;br /&gt;
    	mediaPlayer.start(); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sendo R.raw.snowflake_persephone un arquivo de audio que se atopa no cartafol /res/raw.&lt;br /&gt;
&lt;br /&gt;
Desta forma estamos a pasar directamente ao estado Prepared do diagrama anterior.&lt;br /&gt;
No nosa práctica &amp;lt;u&amp;gt;non usaremos&amp;lt;/u&amp;gt; esta forma de cargar o audio.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Caso práctico===&lt;br /&gt;
&lt;br /&gt;
O obxectivo desta práctica é reproducir un arquivo de música gardado en /res/raw e outro en streaming de Internet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Se instalades a aplicación nun dispositivo real tedes que ter conexión a Internet para que funcione a reprodución en streaming.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Multimedia_Reprod_09.jpg |400px | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Preparación====&lt;br /&gt;
&lt;br /&gt;
* Copiamos o arquivo de audio (ou outro calquera que podades utilizar) ao cartafol /res/raw.&lt;br /&gt;
&lt;br /&gt;
[[Media:snowflake_persephone.mp3]] . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ATENCIÓN:&amp;#039;&amp;#039;&amp;#039; Ao ser un arquivo que vai ser gardado no interior do cartafol /res de Android, o arquivo &amp;#039;&amp;#039;&amp;#039;non pode ter letras maiúsculas&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Copiando arquivo de audio a /res/raw&amp;quot; widths=&amp;quot;300&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Image:PDM_Avanzada_Multimedia_Reprod_04.jpg| Creamos o cartafol &amp;#039;&amp;#039;&amp;#039;raw&amp;#039;&amp;#039;&amp;#039; dentro de /res.&lt;br /&gt;
Image:PDM_Avanzada_Multimedia_Reprod_05.jpg | Copiamos o arquivo de audio anterior. TODAS AS LETRAS DEBEN IR EN MINÚSCULAS.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos a Activity====&lt;br /&gt;
&lt;br /&gt;
*Nome do proxecto: &amp;#039;&amp;#039;&amp;#039;UD2_01_MultimediaReproductor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Nome da activity: &amp;#039;&amp;#039;&amp;#039;UD2_01_MultimediaReproductor.java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código do layout xml&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Por motivos de tempo para o alumnado o deseño non fai uso de constantes externas definidas no cartafol values. Queda claro que esta debería ser a opción escollida para o deseño das Interfaces de Usuario.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;br /&gt;
    xmlns:tools=&amp;quot;http://schemas.android.com/tools&amp;quot;&lt;br /&gt;
    android:id=&amp;quot;@+id/LinearLayout1&amp;quot;&lt;br /&gt;
    android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
    android:orientation=&amp;quot;vertical&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;TextView&lt;br /&gt;
        android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:gravity=&amp;quot;center_horizontal&amp;quot;&lt;br /&gt;
        android:layout_marginBottom=&amp;quot;20dp&amp;quot;&lt;br /&gt;
        android:text=&amp;quot;UD2_01_Multimedia&amp;quot;&lt;br /&gt;
        android:textSize=&amp;quot;20sp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 		&amp;lt;TableLayout&lt;br /&gt;
 		    android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
 		    android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
 		    android:layout_gravity=&amp;quot;bottom&amp;quot; &lt;br /&gt;
 		    android:isScrollContainer=&amp;quot;true&amp;quot;&lt;br /&gt;
 		    &amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;TableRow&lt;br /&gt;
            android:id=&amp;quot;@+id/tableRow1&amp;quot;&lt;br /&gt;
            android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
            android:layout_height=&amp;quot;wrap_content&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/UD2_01_btnReprLocal&amp;quot;&lt;br /&gt;
                android:width=&amp;quot;0dp&amp;quot;&lt;br /&gt;
                android:layout_weight=&amp;quot;1&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;LOCAL&amp;quot;&lt;br /&gt;
                android:textSize=&amp;quot;10sp&amp;quot;&lt;br /&gt;
                 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/UD2_01_btnReprInternet&amp;quot;&lt;br /&gt;
                android:width=&amp;quot;0dp&amp;quot;&lt;br /&gt;
                android:layout_weight=&amp;quot;1&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;INTERNET&amp;quot;&lt;br /&gt;
                android:textSize=&amp;quot;10sp&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;TableRow&lt;br /&gt;
            android:id=&amp;quot;@+id/tableRow2&amp;quot;&lt;br /&gt;
            android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
            android:layout_height=&amp;quot;wrap_content&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/UD2_02_btnPararRepr&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;0dp&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_weight=&amp;quot;1&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;PARAR&amp;quot;&lt;br /&gt;
                android:textSize=&amp;quot;10sp&amp;quot; /&amp;gt;&lt;br /&gt;
            &lt;br /&gt;
        &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
        &amp;lt;TableRow&lt;br /&gt;
            android:id=&amp;quot;@+id/tableRow4&amp;quot;&lt;br /&gt;
            android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
            android:layout_height=&amp;quot;wrap_content&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/UD2_02_btnSairAplicacion&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;0dp&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_weight=&amp;quot;1&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;SAIR&amp;quot;&lt;br /&gt;
                android:textSize=&amp;quot;10sp&amp;quot; &lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
            &lt;br /&gt;
        &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
   &amp;lt;/TableLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD2_01_MultimediaReproductor&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Reproducir e parar música local e de Internet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;18,19,26-40,48-52,59-64,71-76,106-109,113-124,126-135,142&amp;quot; &amp;gt;&lt;br /&gt;
package com.platega.angel.multimedia;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
&lt;br /&gt;
import android.app.Activity;&lt;br /&gt;
import android.media.AudioManager;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.net.Uri;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.os.Environment;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.view.View.OnClickListener;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
&lt;br /&gt;
public class UD2_01_MultimediaReproductor extends Activity {&lt;br /&gt;
&lt;br /&gt;
	private  MediaPlayer mediaplayer;&lt;br /&gt;
	private boolean pause;	// Indica se o mediaplayer estaba tocando cando cambiamos de aplicación&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
     * Cambia a canción no MediaPlayer&lt;br /&gt;
     * @param uri&lt;br /&gt;
     */&lt;br /&gt;
    private void cambiarCancion(Uri uri){&lt;br /&gt;
        try {&lt;br /&gt;
        	mediaplayer.reset();&lt;br /&gt;
        	&lt;br /&gt;
        	mediaplayer.setDataSource(getApplicationContext(),uri);&lt;br /&gt;
       	 	mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);&lt;br /&gt;
       	 	mediaplayer.prepare();&lt;br /&gt;
        	mediaplayer.start();&lt;br /&gt;
	  } catch (Exception e) {&lt;br /&gt;
		// TODO Auto-generated catch block&lt;br /&gt;
		e.printStackTrace();&lt;br /&gt;
		Log.e(&amp;quot;MULTIMEDIA&amp;quot;,e.getMessage());&lt;br /&gt;
	  }&lt;br /&gt;
    	&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	private void xestionarEventos(){&lt;br /&gt;
		&lt;br /&gt;
		Button btnLocal = (Button)findViewById(R.id.UD2_01_btnReprLocal);&lt;br /&gt;
		btnLocal.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				Uri uri = Uri.parse(&amp;quot;android.resource://&amp;quot; + getPackageName()+ &amp;quot;/&amp;quot; + R.raw.snowflake_persephone);&lt;br /&gt;
				cambiarCancion(uri);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		Button btnInternet = (Button)findViewById(R.id.UD2_01_btnReprInternet);&lt;br /&gt;
		btnInternet.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				String url = &amp;quot;http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3&amp;quot;;&lt;br /&gt;
				Uri uri = Uri.parse(Uri.encode(url));&lt;br /&gt;
				cambiarCancion(uri);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		Button btnParar = (Button)findViewById(R.id.UD2_02_btnPararRepr);&lt;br /&gt;
		btnParar.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				if (mediaplayer.isPlaying())&lt;br /&gt;
					mediaplayer.stop();&lt;br /&gt;
				pause=false;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		Button btnSair = (Button) findViewById(R.id.UD2_02_btnSairAplicacion);&lt;br /&gt;
		btnSair.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				finish();&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
    	super.onPause();&lt;br /&gt;
    	&lt;br /&gt;
    	if (mediaplayer.isPlaying()){&lt;br /&gt;
        	mediaplayer.pause();&lt;br /&gt;
        	pause = true;&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
    	super.onResume();&lt;br /&gt;
    	&lt;br /&gt;
    	if (pause) {&lt;br /&gt;
    		mediaplayer.start();&lt;br /&gt;
    		pause = false;&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onSaveInstanceState(Bundle estado) {&lt;br /&gt;
            estado.putBoolean(&amp;quot;MEDIAPLAYER_PAUSE&amp;quot;, pause);&lt;br /&gt;
            super.onSaveInstanceState(estado);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onRestoreInstanceState(Bundle savedInstanceState) {&lt;br /&gt;
            super.onRestoreInstanceState(savedInstanceState);&lt;br /&gt;
            savedInstanceState.putBoolean(&amp;quot;MEDIAPLAYER_PAUSE&amp;quot;, false);&lt;br /&gt;
            pause = savedInstanceState.getBoolean(&amp;quot;MEDIAPLAYER_PAUSE&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
    	super.onDestroy();&lt;br /&gt;
    	&lt;br /&gt;
    	if (mediaplayer.isPlaying()) mediaplayer.stop();&lt;br /&gt;
    	&lt;br /&gt;
    	if (mediaplayer != null) mediaplayer.release();&lt;br /&gt;
    	mediaplayer = null;&lt;br /&gt;
    	&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_ud2_01__multimedia_reproductor);&lt;br /&gt;
&lt;br /&gt;
        mediaplayer = new MediaPlayer();&lt;br /&gt;
        pause = false;&lt;br /&gt;
        xestionarEventos();&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Liña 18: Definimos o reprodutor.&lt;br /&gt;
* Liña 19: Definimos unha variable booleana que nos indique cando o reprodutor está en estado de PAUSE.&lt;br /&gt;
* Liñas 26-40: Cambiamos de canción. Fixarse como sempre chamamos ao método reset() para pasar ao estado que nos permite cambiar a fonte de audio.&lt;br /&gt;
* Liñas 48-52: Prememos o botón de LOCAL e definimos a URI para buscar o arquivo en /res/raw.&lt;br /&gt;
* Liñas 59-64: Prememos o botón de INTERNET e definimos a URI para buscar o arquivo indicada na URL.&lt;br /&gt;
* Liñas 71-76: Prememos o botón de STOP. Comprobamos se o mediaplayer está tocando para paralo.&lt;br /&gt;
* Liñas 106-109: Comprobamos se o mediaplayer está tocando para poñelo en pause. Cambiamos o valor da variable pause a true. Isto é necesario xa que non temos forma de saber a través do mediaplayer se este se atopa nese estado.&lt;br /&gt;
* Liñas 106-109: Se volvemos á aplicación comprobamos se o mediaplayer estaba tocando (pause=true) e nese caso continuamos tocando a canción. Isto pasará cando cambiemos de aplicación sen pechala.&lt;br /&gt;
* Liñas 113-124: Se cambiamos de aplicación recuperamos o estado do mediaplayer. Despois poñemos a false a variable pause por se xiramos o dispositivo estando tocando, para que non recupere o último estado.&lt;br /&gt;
* Liñas 126-135: De saímos da aplicación paramos de tocar e liberamos o mediaplayer.&lt;br /&gt;
* Liña 142: Instanciamos o mediaplayer.&lt;br /&gt;
&lt;br /&gt;
==Carga asíncrona==&lt;br /&gt;
&lt;br /&gt;
Cando poñemos en marcha un arquivo de audio que non se atopa localmente, non é boa idea facelo no fío principal da aplicación, xa que se leva un tempo cargar a música, e a aplicación quedaría bloqueada mentres tanto.&lt;br /&gt;
Para evitalo teríamos que crear nós un fío de execución separado do principal, pero este traballo xa o temos feito, se chamamos ao [http://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync%28%29 método prepareAsync()] . Cando a mediaplayer estea listo, chamará automaticamente ao método onPrepared da interface MediaPlayer.OnPreparedListener. Para asociar dita interface o mediaplayer, faremos uso do método setOnPreparedListener().&lt;br /&gt;
&lt;br /&gt;
Os pasos serían:&lt;br /&gt;
&lt;br /&gt;
* Asociar a interface ao mediaplayer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
        mediaplayer.setOnPreparedListener(new OnPreparedListener(){&lt;br /&gt;
        	&lt;br /&gt;
        }&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Ao definir internamente a clase que xestionará o preparedlistener, é necesario implementar o método da interface dentro da definición:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
        mediaplayer.setOnPreparedListener(new OnPreparedListener(){&lt;br /&gt;
&lt;br /&gt;
			public void onPrepared(MediaPlayer arg0) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Agora xa podemos codificar o método onPrepared que será chamado automaticamente cando o música estea preparada. O único que temos que facer dentro de dito método será unha chamada ao método start() da clase MediaPlayer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Agora en vez de chamar o método prepare, teremos que chamar o método prepareAsync().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Caso práctico===&lt;br /&gt;
&lt;br /&gt;
O obxectivo desta práctica é facer o mesmo que na práctica anterior pero chamando ao método &amp;#039;&amp;#039;&amp;#039;prepareAsync.&lt;br /&gt;
&lt;br /&gt;
====Preparación====&lt;br /&gt;
&lt;br /&gt;
O alumno debe crear unha nova activity de nome &amp;#039;&amp;#039;&amp;#039;UD2_02_MultimediaReproductor&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Esta activity ten o mesmo layout que a activity anterior (activity_ud2_01__multimedia_reproductor.xml) xa que non imos facer modificacións no seu aspecto.&lt;br /&gt;
&lt;br /&gt;
====Creamos a activity====&lt;br /&gt;
&lt;br /&gt;
*Nome do proxecto: &amp;#039;&amp;#039;&amp;#039;UD2_02_MultimediaReproductor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Nome da activity: &amp;#039;&amp;#039;&amp;#039;UD2_02_MultimediaReproductor.java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD2_02_MultimediaReproductor&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Amosar como cargar unha canción de forma asíncrona.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;30,42-49&amp;quot; &amp;gt;&lt;br /&gt;
package com.platega.angel.multimedia;&lt;br /&gt;
&lt;br /&gt;
import android.app.Activity;&lt;br /&gt;
import android.media.AudioManager;&lt;br /&gt;
import android.media.MediaPlayer;&lt;br /&gt;
import android.media.MediaPlayer.OnPreparedListener;&lt;br /&gt;
import android.net.Uri;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.view.View.OnClickListener;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
&lt;br /&gt;
public class UD2_02_MultimediaReproductor extends Activity {&lt;br /&gt;
&lt;br /&gt;
	private  MediaPlayer mediaplayer;&lt;br /&gt;
	private boolean pause;	// Indica se o mediaplayer estaba tocando cando cambiamos de aplicación&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
     * Cambia a canción no MediaPlayer&lt;br /&gt;
     * @param uri&lt;br /&gt;
     */&lt;br /&gt;
    private void cambiarCancion(Uri uri){&lt;br /&gt;
        try {&lt;br /&gt;
        	mediaplayer.reset();&lt;br /&gt;
        	&lt;br /&gt;
        	mediaplayer.setDataSource(getApplicationContext(),uri);&lt;br /&gt;
       	 	mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);&lt;br /&gt;
       	 	mediaplayer.prepareAsync();&lt;br /&gt;
//        	mediaplayer.start();		O FACEMOS DE FORMA ASINCRONA&lt;br /&gt;
	  } catch (Exception e) {&lt;br /&gt;
		// TODO Auto-generated catch block&lt;br /&gt;
		e.printStackTrace();&lt;br /&gt;
		Log.e(&amp;quot;MULTIMEDIA&amp;quot;,e.getMessage());&lt;br /&gt;
	  }&lt;br /&gt;
    	&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	private void xestionarEventos(){&lt;br /&gt;
		&lt;br /&gt;
		mediaplayer.setOnPreparedListener(new OnPreparedListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onPrepared(MediaPlayer mp) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				mediaplayer.start();&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		Button btnLocal = (Button)findViewById(R.id.UD2_01_btnReprLocal);&lt;br /&gt;
		btnLocal.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				Uri uri = Uri.parse(&amp;quot;android.resource://&amp;quot; + getPackageName()+ &amp;quot;/&amp;quot; + R.raw.snowflake_persephone);&lt;br /&gt;
				cambiarCancion(uri);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		Button btnInternet = (Button)findViewById(R.id.UD2_01_btnReprInternet);&lt;br /&gt;
		btnInternet.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				String url = Uri.encode(&amp;quot;http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3&amp;quot;);&lt;br /&gt;
				Uri uri = Uri.parse(Uri.encode(url));&lt;br /&gt;
				cambiarCancion(uri);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		Button btnParar = (Button)findViewById(R.id.UD2_02_btnPararRepr);&lt;br /&gt;
		btnParar.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				if (mediaplayer.isPlaying())&lt;br /&gt;
					mediaplayer.stop();&lt;br /&gt;
				pause=false;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		Button btnSair = (Button) findViewById(R.id.UD2_02_btnSairAplicacion);&lt;br /&gt;
		btnSair.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				finish();&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onPause() {&lt;br /&gt;
    	super.onPause();&lt;br /&gt;
    	&lt;br /&gt;
    	if (mediaplayer.isPlaying()){&lt;br /&gt;
        	mediaplayer.pause();&lt;br /&gt;
        	pause = true;&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
    	super.onResume();&lt;br /&gt;
    	&lt;br /&gt;
    	if (pause) {&lt;br /&gt;
    		mediaplayer.start();&lt;br /&gt;
    		pause = false;&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onSaveInstanceState(Bundle estado) {&lt;br /&gt;
            estado.putBoolean(&amp;quot;MEDIAPLAYER_PAUSE&amp;quot;, pause);&lt;br /&gt;
            super.onSaveInstanceState(estado);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onRestoreInstanceState(Bundle savedInstanceState) {&lt;br /&gt;
            super.onRestoreInstanceState(savedInstanceState);&lt;br /&gt;
            savedInstanceState.putBoolean(&amp;quot;MEDIAPLAYER_PAUSE&amp;quot;, false);&lt;br /&gt;
            pause = savedInstanceState.getBoolean(&amp;quot;MEDIAPLAYER_PAUSE&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onDestroy() {&lt;br /&gt;
    	super.onDestroy();&lt;br /&gt;
    	&lt;br /&gt;
    	if (mediaplayer.isPlaying()) mediaplayer.stop();&lt;br /&gt;
    	&lt;br /&gt;
    	if (mediaplayer != null) mediaplayer.release();&lt;br /&gt;
    	mediaplayer = null;&lt;br /&gt;
    	&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_ud2_02__multimedia_reproductor);&lt;br /&gt;
&lt;br /&gt;
        mediaplayer = new MediaPlayer();&lt;br /&gt;
        pause = false;&lt;br /&gt;
        xestionarEventos();&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2014).&lt;/div&gt;</summary>
		<author><name>Angelfg</name></author>
	</entry>
</feed>