PDM Avanzado Reprodución de Audio

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introdución

No caso da reprodución do audio, teremos que facer uso das clases MediaPlayer e AudioManager.

Clase utilizadas: MediaPlayer: esta clase é a principal utilizada para reproducir audio – vídeo. AudioManager: manexa fontes de audio e gravacións de audio en dispositivos. Nesta parte só imos utilizala para indicar o tipo de audio.

Permisos necesarios a engadir no arquivo AndroidManifest.xml (nos imos engadir todos):

  • Se o dispositivo necesita conexión a internet (para escoitar música en streaming, por exemplo) temos que engadir o permiso:
1 <uses-permission android:name="android.permission.INTERNET" />


  • 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:
1 <uses-permission android:name="android.permission.WAKE_LOCK" />


  • 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.
  • Se imos ler na tarxeta SD:
  • Se a versión do S.O. Android é inferior á 4.1 non precisamos ningún permiso.
  • Se a versión do S.O. Android é superior ou igual á 4.1 debemos engadir o permiso: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • Se imos escribir na tarxeta SD:
  • Se a versión do S.O. Android é inferior á 4.4 o permiso é: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> .
  • 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.

Os permisos necesarios son postos no ficheiro AndroidManifest.xml da aplicación.

PDM Avanzada DatosPersistentes 14C.jpg


 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="com.example.angel.olamundo" >
 3 
 4     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 5 
 6     <application
 7         android:allowBackup="true"
 8         android:icon="@mipmap/ic_launcher"
 9         android:label="@string/app_name"
10         android:supportsRtl="true"
11         android:theme="@style/AppTheme" >
12         <activity android:name=".MainActivity" >
13             <intent-filter>
14                 <action android:name="android.intent.action.MAIN" />
15 
16                 <category android:name="android.intent.category.LAUNCHER" />
17             </intent-filter>
18         </activity>
19     </application>
20 
21 </manifest>
  • Importante: Débense poñer antes da etiqueta <application>.

Nota: se queremos ter unha música de fondo na nosa aplicación o máis lóxico sería ter un servizo.


  • Nota importante: A maiores, se imos instalar a nosa aplicación sobre un dispositivo cunha API>=23 é necesario pedir o permiso de acceso á tarxeta SD por programación como está indicado neste punto da Wiki.

MediaPlayer

Os recursos (arquivos de audio) que podemos utilizar con esta clase poden ser:

  • Locais: arquivos locais gardados no cartafol /res/raw/ (deberemos crear o cartafol /raw/ se non existe).
  • URIs internas: 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.
  • URL Externos (streaming): arquivos multimedia que se atopan en Internet.


Podedes consultar a lista de formatos de audio – vídeo soportados en http://developer.android.com/guide/appendix/media-formats.html


Imos facer unha pequena práctica na que imos reproducir un arquivo multimedia. Creamos no proxecto de Android - Multimedia un cartafol de nome 'raw' dentro do cartafol /res/ do proxecto:

PDM Audio 1.jpg



Reproducir música

Para cargar un arquivo de audio temos que seguir os seguintes pasos:

  • Crear un obxecto da clase MediaPlayer.
1 	private  MediaPlayer mediaplayer;
2         .............
3         mediaplayer = new MediaPlayer();
  • Chamar ao método setDataSource 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 Exception aínda que esta forma non é a recomendada).
No exemplo usamos Exception para simplificar o código xa que se non teríamos que ter isto:
 1 			try {
 2 				mediaplayer.setDataSource(path);
 3 			} catch (IllegalArgumentException e) {
 4 				// TODO Auto-generated catch block
 5 				e.printStackTrace();
 6 			} catch (SecurityException e) {
 7 				// TODO Auto-generated catch block
 8 				e.printStackTrace();
 9 			} catch (IllegalStateException e) {
10 				// TODO Auto-generated catch block
11 				e.printStackTrace();
12 			} catch (IOException e) {
13 				// TODO Auto-generated catch block
14 				e.printStackTrace();
15 			}

Con este método indicamos de onde imos a cargar o audio.

Podemos ter varias posibilidades:

  • O arquivo se atopa en /res/raw:
1         MediaPlayer mediaplayer = new MediaPlayer();
2         Uri uri = Uri.parse("android.resource://" + getPackageName()+ "/" + R.raw.snowflake_persephone);
3         try {
4          		mediaplayer.setDataSource(getApplicationContext(), uri);
5                         .....
6         }


  • O arquivo provén da tarxeta SD.
Temos varias opcións:
1 MediaPlayer mediaplayer = new MediaPlayer();
2 String path=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + "snowflake_persephone.mp3";
3 try {
4 	mediaplayer.setDataSource(Uri.encode(path));
5         .....
6         }
1 MediaPlayer mediaplayer = new MediaPlayer();
2 String path =Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + "snowflake_persephone.mp3";
3 Uri uri = Uri.parse(path);        	
4 try {
5 	mediaplayer.setDataSource(getApplicationContext(),uri);
6         .....
7         }


  • O arquivo provén de Internet (música en Streaming).
Nota: Se estades a utilizar un dispositivo real ten que ter conexión a Internet para que funcione.
Temos varias opcións:
1 MediaPlayer mediaplayer = new MediaPlayer();
2 String url="http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3";
3 try {
4 	mediaplayer.setDataSource(url);
5         .....
6         }


Pode suceder que a dirección da URL teña espazos en branco ou caracteres especiais. Nese caso teremos que 'codificar' antes a url a partires do último carácter '/':

1 MediaPlayer mediaplayer = new MediaPlayer();
2 String url="http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3";
3 int pos = url.lastIndexOf('/') + 1;
4 Uri uri = Uri.parse(url.substring(0, pos) + Uri.encode(url.substring(pos)));
5 try {
6 	mediaplayer.setDataSource(getApplicationContext(),uri);
7         .....
8         }


  • Chamar ao método setAudioStreamType(AudioManager.STREAM_MUSIC) 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).
  • Chamar ao método prepare (pode lanzar unha excepción IOException).
  • Chamar ao método start.

Todos estes pasos son necesarios facelos nesta orde xa que o MediaPlayer vai pasar por unha serie de estados que nos van obrigar a poder facer só unha accións determinadas dependendo do estado no que nos atopemos.

Vexamos o diagrama de estados do MediaPlayer:

PDM Avanzada Multimedia Reprod 07.jpg
Gráfico obtido dende http://developer.android.com/reference/android/media/MediaPlayer.html


Imos analizar dito diagrama.

Cando instanciamos o MediaPlayer (facemos o new) nos situamos no estado idle. Dende dito estado so podemos pasar o estado initialized chamando o método setDataSource.

Se intentemos chamar a outro método (coma start(),...) daranos unha excepción (IlegalStateException). 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 estado de stop, dende dito estado non podemos chamar ao método setDataSource (mirar diagrama).

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:

PDM Avanzada Multimedia Reprod 08.jpg




Podemos cargar un arquivo de audio sen facer os pasos anteriores da seguinte forma:

1         MediaPlayer mediaPlayer=MediaPlayer.create(this, R.raw.snowflake_persephone);
2     	mediaPlayer.start();

Sendo R.raw.snowflake_persephone un arquivo de audio que se atopa no cartafol /res/raw.

Desta forma estamos a pasar directamente ao estado Prepared do diagrama anterior. No nosa práctica non usaremos esta forma de cargar o audio.




Caso práctico

Se non o temos creado antes, crearemos un novo paquete de nome: Multimedia como un subpaquete do teu paquete principal.



  • Dentro do paquete Adaptadores crear unha nova 'Empty Activity' de nome: UD05_01_Audio_Reproducir de tipo Launcher e sen compatibilidade.
Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.


Nota: Nos volcados de pantalla pode ser que apareza outra unidade no título. Non facede caso.



O obxectivo desta práctica é reproducir un arquivo de música gardado en /res/raw e outro en streaming de Internet.
Nota: Se instalades a aplicación nun dispositivo real tedes que ter conexión a Internet para que funcione a reprodución en streaming e deberedes de poñer o permiso correspondente no AndroidManifiest.xml

PDM Avanzada Multimedia Reprod 09.jpg


Preparación

  • Copiamos o arquivo de audio (ou outro calquera que podades utilizar) ao cartafol /res/raw.

Media:snowflake_persephone.mp3 .

ATENCIÓN: Ao ser un arquivo que vai ser gardado no interior do cartafol /res de Android, o arquivo non pode ter letras maiúsculas.

Código do layout xml

Nota: 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.

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:id="@+id/LinearLayout1"
 5     android:layout_width="match_parent"
 6     android:layout_height="wrap_content"
 7     android:orientation="vertical" >
 8 
 9 
10     <TextView
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content"
13         android:gravity="center_horizontal"
14         android:layout_marginBottom="20dp"
15         android:text="UD6_01_Multimedia"
16         android:textSize="20sp" />
17 
18 
19     <TableLayout
20         android:layout_width="match_parent"
21         android:layout_height="wrap_content"
22         android:layout_gravity="bottom"
23         android:isScrollContainer="true"
24         >
25 
26         <TableRow
27             android:id="@+id/tableRow1"
28             android:layout_width="match_parent"
29             android:layout_height="wrap_content" >
30 
31 
32             <Button
33                 android:id="@+id/btnReprLocal_UD05_01_audio_repr"
34                 android:width="0dp"
35                 android:layout_weight="1"
36                 android:layout_width="wrap_content"
37                 android:layout_height="wrap_content"
38                 android:text="LOCAL"
39                 android:textSize="10sp"
40                 />
41 
42             <Button
43                 android:id="@+id/btnReprInternet_UD05_01_audio_repr"
44                 android:width="0dp"
45                 android:layout_weight="1"
46                 android:layout_width="wrap_content"
47                 android:layout_height="wrap_content"
48                 android:text="INTERNET"
49                 android:textSize="10sp"
50                 />
51 
52         </TableRow>
53 
54         <TableRow
55             android:id="@+id/tableRow2"
56             android:layout_width="match_parent"
57             android:layout_height="wrap_content" >
58 
59             <Button
60                 android:id="@+id/btnPararRepr_UD05_01_audio_repr"
61                 android:layout_width="0dp"
62                 android:layout_height="wrap_content"
63                 android:layout_weight="1"
64                 android:text="PARAR"
65                 android:textSize="10sp" />
66 
67         </TableRow>
68         <TableRow
69             android:id="@+id/tableRow4"
70             android:layout_width="match_parent"
71             android:layout_height="wrap_content" >
72 
73             <Button
74                 android:id="@+id/btnSair_UD05_01_audio_repr"
75                 android:layout_width="0dp"
76                 android:layout_height="wrap_content"
77                 android:layout_weight="1"
78                 android:text="SAIR"
79                 android:textSize="10sp"
80                 />
81 
82         </TableRow>
83 
84 
85     </TableLayout>
86 
87 </LinearLayout>



Código da Activity

Obxectivo: Reproducir e parar música local e de Internet.

  1 package es.cursoandroid.cifprodolfoucha.aprendiendo.Multimedia;
  2 
  3 import android.Manifest;
  4 import android.app.Activity;
  5 import android.content.pm.PackageManager;
  6 import android.media.AudioManager;
  7 import android.media.MediaPlayer;
  8 import android.net.Uri;
  9 import android.os.Build;
 10 import android.os.Bundle;
 11 import android.util.Log;
 12 import android.view.View;
 13 import android.widget.Button;
 14 import android.widget.Toast;
 15 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
 16 
 17 public class UD05_01_Audio_Reproducir extends Activity {
 18     private  MediaPlayer mediaplayer;
 19     private boolean pause;	// Indica se o mediaplayer estaba tocando cando cambiamos de aplicación
 20 
 21 
 22     /**
 23      * Cambia a canción no MediaPlayer
 24      * @param uri
 25      */
 26     private void cambiarCancion(Uri uri){
 27         try {
 28             mediaplayer.reset();
 29 
 30             mediaplayer.setDataSource(getApplicationContext(),uri);
 31             mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 32             mediaplayer.prepare();
 33             mediaplayer.start();
 34         } catch (Exception e) {
 35             // TODO Auto-generated catch block
 36             e.printStackTrace();
 37             Log.e("MULTIMEDIA",e.getMessage());
 38         }
 39 
 40     }
 41 
 42     private void xestionarEventos(){
 43 
 44         Button btnLocal = (Button)findViewById(R.id.btnReprLocal_UD05_01_audio_repr);
 45         btnLocal.setOnClickListener(new View.OnClickListener() {
 46 
 47             @Override
 48             public void onClick(View v) {
 49                 // TODO Auto-generated method stub
 50                 Uri uri = Uri.parse("android.resource://" + getPackageName()+ "/" + R.raw.snowflake_persephone);
 51                 cambiarCancion(uri);
 52             }
 53         });
 54 
 55         Button btnInternet = (Button)findViewById(R.id.btnReprInternet_UD05_01_audio_repr);
 56         btnInternet.setOnClickListener(new View.OnClickListener() {
 57 
 58             @Override
 59             public void onClick(View v) {
 60                 // TODO Auto-generated method stub
 61                 String url = "http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3";
 62                 // Se a URL ven con espacios en branco teremos que facer un parteUrl + Uri.encode(parteUltinaURL) sendo parteUltinaURL a parte que vai no último lugar.
 63                 Uri uri = Uri.parse(url);
 64                 cambiarCancion(uri);
 65             }
 66         });
 67         Button btnParar = (Button)findViewById(R.id.btnPararRepr_UD05_01_audio_repr);
 68         btnParar.setOnClickListener(new View.OnClickListener() {
 69 
 70             @Override
 71             public void onClick(View v) {
 72                 // TODO Auto-generated method stub
 73                 if (mediaplayer.isPlaying())
 74                     mediaplayer.stop();
 75                 pause=false;
 76             }
 77         });
 78 
 79         Button btnSair = (Button) findViewById(R.id.btnSair_UD05_01_audio_repr);
 80         btnSair.setOnClickListener(new View.OnClickListener() {
 81 
 82             @Override
 83             public void onClick(View v) {
 84                 // TODO Auto-generated method stub
 85                 finish();
 86             }
 87         });
 88 
 89 
 90     }
 91 
 92     @Override
 93     protected void onPause() {
 94         super.onPause();
 95 
 96         if (mediaplayer.isPlaying()){
 97             mediaplayer.pause();
 98             pause = true;
 99         }
100     }
101 
102     @Override
103     protected void onResume() {
104         super.onResume();
105 
106         if (pause) {
107             mediaplayer.start();
108             pause = false;
109         }
110     }
111 
112 
113 
114     @Override
115     protected void onDestroy() {
116         super.onDestroy();
117 
118         if (mediaplayer.isPlaying()) mediaplayer.stop();
119 
120         if (mediaplayer != null) mediaplayer.release();
121         mediaplayer = null;
122 
123     }
124 
125     @Override
126     protected void onCreate(Bundle savedInstanceState) {
127         super.onCreate(savedInstanceState);
128         setContentView(R.layout.activity_ud05_01__audio__reproducir);
129 
130         mediaplayer = new MediaPlayer();
131         pause = false;
132         xestionarEventos();
133 
134 
135     }
136 }
  • Liña 18: Definimos o reprodutor.
  • Liña 19: Definimos unha variable booleana que nos indique cando o reprodutor está en estado de PAUSE.
  • 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.
  • Liñas 48-52: Prememos o botón de LOCAL e definimos a URI para buscar o arquivo en /res/raw.
  • Liñas 59-64: Prememos o botón de INTERNET e definimos a URI para buscar o arquivo indicada na URL.
  • Liñas 71-76: Prememos o botón de STOP. Comprobamos se o mediaplayer está tocando para paralo.
  • 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.
  • 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.
  • Liñas 118-121: Se saímos da aplicación paramos de tocar e liberamos o mediaplayer.
  • Liña 128: Instanciamos o mediaplayer.

Carga asíncrona

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. 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 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().

Os pasos serían:

  • Asociar a interface ao mediaplayer:
1         mediaplayer.setOnPreparedListener(new OnPreparedListener(){
2         	
3         }
4         );
  • Ao definir internamente a clase que xestionará o preparedlistener, é necesario implementar o método da interface dentro da definición:
1         mediaplayer.setOnPreparedListener(new OnPreparedListener(){
2 
3 			public void onPrepared(MediaPlayer arg0) {
4 				// TODO Auto-generated method stub
5 				
6 			}
7         }
8         );
  • 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.


Nota: Agora en vez de chamar o método prepare, teremos que chamar o método prepareAsync().


Caso práctico

O obxectivo desta práctica é facer o mesmo que na práctica anterior pero chamando ao método prepareAsync.

Preparación

Se non o temos creado antes, crearemos un novo paquete de nome: Multimedia como un subpaquete do teu paquete principal.



  • Dentro do paquete Adaptadores crear unha nova 'Empty Activity' de nome: UD05_02_Audio_Reproducir de tipo Launcher e sen compatibilidade.
Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.
Na activity cargaremos o mesmo layout que no caso práctico anterior.
Quen o prefira pode facelo sobre un layout novo copiando todo o código e cambiando os nomes (id´s) dos views.



Código da Activity

Obxectivo: Amosar como cargar unha canción de forma asíncrona.

  1 package es.cursoandroid.cifprodolfoucha.aprendiendo.Multimedia;
  2 
  3 
  4 import android.app.Activity;
  5 import android.media.AudioManager;
  6 import android.media.MediaPlayer;
  7 import android.net.Uri;
  8 import android.os.Bundle;
  9 import android.util.Log;
 10 import android.view.View;
 11 import android.widget.Button;
 12 
 13 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
 14 
 15 public class UD05_02_Audio_Reproducir extends Activity {
 16     private  MediaPlayer mediaplayer;
 17     private boolean pause;	// Indica se o mediaplayer estaba tocando cando cambiamos de aplicación
 18 
 19 
 20     /**
 21      * Cambia a canción no MediaPlayer
 22      * @param uri
 23      */
 24     private void cambiarCancion(Uri uri){
 25         try {
 26             mediaplayer.reset();
 27 
 28             mediaplayer.setDataSource(getApplicationContext(),uri);
 29             mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 30             mediaplayer.prepareAsync();
 31 //        	mediaplayer.start();		O FACEMOS DE FORMA ASINCRONA
 32         } catch (Exception e) {
 33             // TODO Auto-generated catch block
 34             e.printStackTrace();
 35             Log.e("MULTIMEDIA",e.getMessage());
 36         }
 37 
 38     }
 39 
 40     private void xestionarEventos(){
 41 
 42         mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
 43 
 44             @Override
 45             public void onPrepared(MediaPlayer mp) {
 46                 // TODO Auto-generated method stub
 47                 mediaplayer.start();
 48             }
 49         });
 50 
 51         Button btnLocal = (Button)findViewById(R.id.btnReprLocal_UD05_01_audio_repr);
 52         btnLocal.setOnClickListener(new View.OnClickListener() {
 53 
 54             @Override
 55             public void onClick(View v) {
 56                 // TODO Auto-generated method stub
 57                 Uri uri = Uri.parse("android.resource://" + getPackageName()+ "/" + R.raw.snowflake_persephone);
 58                 cambiarCancion(uri);
 59             }
 60         });
 61 
 62         Button btnInternet = (Button)findViewById(R.id.btnReprInternet_UD05_01_audio_repr);
 63         btnInternet.setOnClickListener(new View.OnClickListener() {
 64 
 65             @Override
 66             public void onClick(View v) {
 67                 // TODO Auto-generated method stub
 68                 String url = "http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood.mp3";
 69                 // Se a URL ven con espacios en branco teremos que facer un parteUrl + Uri.encode(parteUltinaURL) sendo parteUltinaURL a parte que vai no último lugar.
 70                 Uri uri = Uri.parse(url);
 71                 cambiarCancion(uri);
 72             }
 73         });
 74         Button btnParar = (Button)findViewById(R.id.btnPararRepr_UD05_01_audio_repr);
 75         btnParar.setOnClickListener(new View.OnClickListener() {
 76 
 77             @Override
 78             public void onClick(View v) {
 79                 // TODO Auto-generated method stub
 80                 if (mediaplayer.isPlaying())
 81                     mediaplayer.stop();
 82                 pause=false;
 83             }
 84         });
 85 
 86         Button btnSair = (Button) findViewById(R.id.btnSair_UD05_01_audio_repr);
 87         btnSair.setOnClickListener(new View.OnClickListener() {
 88 
 89             @Override
 90             public void onClick(View v) {
 91                 // TODO Auto-generated method stub
 92                 finish();
 93             }
 94         });
 95 
 96 
 97     }
 98 
 99     @Override
100     protected void onPause() {
101         super.onPause();
102 
103         if (mediaplayer.isPlaying()){
104             mediaplayer.pause();
105             pause = true;
106         }
107     }
108 
109     @Override
110     protected void onResume() {
111         super.onResume();
112 
113         if (pause) {
114             mediaplayer.start();
115             pause = false;
116         }
117     }
118 
119     @Override
120     protected void onDestroy() {
121         super.onDestroy();
122 
123         if (mediaplayer.isPlaying()) mediaplayer.stop();
124 
125         if (mediaplayer != null) mediaplayer.release();
126         mediaplayer = null;
127 
128     }
129 
130     @Override
131     protected void onCreate(Bundle savedInstanceState) {
132         super.onCreate(savedInstanceState);
133         setContentView(R.layout.activity_ud05_01__audio__reproducir);
134 
135         mediaplayer = new MediaPlayer();
136         pause = false;
137         xestionarEventos();
138 
139 
140     }
141 }
  • Liña 133: Fixarse como estamos a cargar o layout da práctica 1.




-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2014).