Está en la página 1de 48

Desarrollo de aplicaciones

Curso 14/15 Android

Desarrollo de un
reproductor
mp3
Desarrollo de
aplicaciones
Android

Contenidos
● Ciclo de vida ● Desarrollo de la
● Fragmentos aplicación Mp3Player
● Menús paso a paso
● Eventos de la UI
● Cuadros de diálogo
● MediaPlayer
● Intents
● ListViews y Layouts

Mp3Player © Grupo Arco 2


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 1
● Creación de una aplicación vacía, basada en el
hola mundo

Mp3Player © Grupo Arco 3


Desarrollo de
aplicaciones
Android

Ciclo de vida
● Una aplicación está compuesta por Activities
● El Manifest indica cuál será la Activity inicial
● Debe indicar como acción MAIN
● Debe indicar como categoría LAUNCHER
<application
<application
android:allowBackup="true"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" En caso contrario no
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:theme="@style/AppTheme" >> aparecerá el icono en la
<activity
<activity lista de Apps
android:name="com.cep.mp3player.MainActivity"
android:name="com.cep.mp3player.MainActivity"
android:label="@string/app_name"
android:label="@string/app_name" >>
<intent-filter>
<intent-filter>
<action
<action android:name="android.intent.action.MAIN"
android:name="android.intent.action.MAIN" />
/>
<category
<category android:name="android.intent.category.LAUNCHER" />
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</intent-filter>
</activity>
</activity>
</application>
</application>

Mp3Player © Grupo Arco 4


Desarrollo de
aplicaciones
Android

Ciclo de vida
● Ciclo de vida de la actividad:
● Comienza ejecutando el método onCreate()
● Termina ejecutando onDestroy()

@Override
@Override
protected
protected void
void onCreate(Bundle
onCreate(Bundle savedInstanceState)
savedInstanceState) {{ @Override
super.onCreate(savedInstanceState); @Override
super.onCreate(savedInstanceState); public
public void
void onDestroyView()
onDestroyView() {{
setContentView(R.layout.activity_main);
setContentView(R.layout.activity_main); super.onDestroyView();
}} super.onDestroyView();
}}

Mp3Player © Grupo Arco 5


Desarrollo de
aplicaciones
Android

Fragmentos
● A partir de Android 3.0 (API level 11)
● Divide la interfaz de usuario de la actividad en bloques
independientes
● Facilita la adecuación del UI al dispositivo
● Tiene su propio layout

Mp3Player © Grupo Arco 6


Desarrollo de
aplicaciones
Android

Fragmentos
● Ciclo de vida
Inicialización de componentes
Que deben mantenerse cuando
El fragmento está parado pausado

@Override
@Override
public View onCreateView((LayoutInflater inflater, ViewGroup container,
public View onCreateView((LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main,
View rootView = inflater.inflate(R.layout.fragment_main,
container, false);
container, false);
return rootView;
return rootView;
}
}

Necesario para que la


Actividad pueda Instante en el que guardar
dibujarlo los datos que deban
persistir

Mp3Player © Grupo Arco 7


Desarrollo de
aplicaciones
Android

Fragmentos
● Creación estática: declarándolo dentro del layout de la
actividad
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent">
<fragment android:name="com.example.news.ArticleListFragment"
<fragment android:name="com.example.news.ArticleListFragment"
android:id="@+id/list"
android:id="@+id/list"
android:layout_weight="1"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_width="0dp"
android:layout_height="match_parent" />
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>

● Creación dinámica: de forma programática


//
// 1.
1. Obtener
Obtener el
el gestor
gestor de
de fragmentos,
fragmentos, yy aa partir
partir de
de él
él abrir
abrir una
una transacción
transacción
FragmentManager
FragmentManager fragmentManager
fragmentManager == getFragmentManager()
getFragmentManager()
FragmentTransaction
FragmentTransaction fragmentTransaction
fragmentTransaction == fragmentManager.beginTransaction();
fragmentManager.beginTransaction();
//
// 2.
2. Añadir
Añadir el
el nuevo
nuevo fragmento
fragmento indicado
indicado su
su layout
layout
ExampleFragment fragment = new ExampleFragment();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container,
fragmentTransaction.add(R.id.fragment_container, fragment);
fragment);
//
// 3.
3. Commit
Commit para
para cerrar
cerrar la
la transacción
transacción
fragmentTransaction.commit();
fragmentTransaction.commit();

Mp3Player © Grupo Arco 8


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 2
● Adición de una opción de menú para
abandonar la aplicación
● Crear un recurso string action_exit con texto Salir
● Añadir un nuevo item al menú, con id. action_exit, y
referenciando la cadena del mismo nombre
● Añadir la nueva opción al código que trata las
opciones de menú
– Debe ejecutar finish() para abandonar la aplicación

Mp3Player © Grupo Arco 9


Desarrollo de
aplicaciones
Android

Menús
● Desde Android 3.0 se está migrando del botón
dedicado a menús hacia la barra de acciones.
● Tres tipos de menús:

Menú de opciones: aparece cuando el usuario presiona
el botón MENU.
● Menú de contexto: opciones que aparecen cuando el
usuario toca y mantiene el elemento que tiene asociado
dicho menú.

Submenú: aparece cuando el usuario selecciona una
entrada del menú.

Mp3Player © Grupo Arco 10


Desarrollo de
aplicaciones
Android

Definición del menú


● Sea cual sea el tipo, se recomienda definirlo
como un recurso más en su fichero XML:
● p.ej.: res/menu/main.xml
<menu
<menu xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<item
<item
android:id="@+id/action_settings"
android:id="@+id/action_settings"
android:orderInCategory="100"
android:orderInCategory="100"
android:showAsAction="never"
android:showAsAction="never"
android:title="@string/action_settings"/>
android:title="@string/action_settings"/>
</menu>
</menu>

Mp3Player © Grupo Arco 11


Desarrollo de
aplicaciones
Android

Creación del menú


● Hinchar (inflate) el menú mediante código:
cargarlo como un objeto programable

@Override
@Override
public
public boolean
boolean onCreateOptionsMenu(Menu
onCreateOptionsMenu(Menu menu)
menu) {{
MenuInflater inflater = getMenuInflater();
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main,
En este caso se crea un
inflater.inflate(R.menu.main, menu);
menu); menú de opciones
return true;
return true;
}}

La actividad invoca
onCreateOptionsMenu como
parte de su proceso de creación

Mp3Player © Grupo Arco 12


Desarrollo de
aplicaciones
Android

Selección de opciones del menú


● Ante una selección, el sistema invoca
onOptionsItemSelected
● Único argumento del tipo MenuItem

@Override
@Override
public
public boolean
boolean onOptionsItemSelected(MenuItem
onOptionsItemSelected(MenuItem item)
item) {{
switch
switch (item.getItemId())
(item.getItemId()) {{
case
case R.id.action_settings:
R.id.action_settings:
return
return true;
true;
}}
return
return super.onOptionsItemSelected(item);
super.onOptionsItemSelected(item);
}}

Mp3Player © Grupo Arco 13


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 3
● Adición de una opción de menú para mostrar
un cuadro de diálogo con los créditos de la App
● Añadir un nuevo item al menú, con id.
action_about, que muestre el texto Acerca de ...
● Crear un cuado de diálogo de alerta al seleccionar
la opción
– Debe mostrar el texto “Mp3Player v0.1”
– Debe incluir un botón positivo con el mensaje Aceptar.

Mp3Player © Grupo Arco 14


Desarrollo de
aplicaciones
Android

Eventos de la IU
● La interacción con la IU genera eventos que
pueden capturarse para su tratamiento
● Listeners: Interfaz de la clase View con
callbacks para la captura de los eventos
private
private OnClickListener
OnClickListener MyListener
MyListener == new
new OnClickListener()
OnClickListener() {{
public
public void
void onClick(View
onClick(View v)
v) {{
//
// acciones
acciones aa realizar
realizar al
al pulsar
pulsar el
el botón
botón
}}
};
};
protected
protected void
void onCreate(Bundle
onCreate(Bundle savedValues)
savedValues) {{
...
...
//
// referencia
referencia al
al botón
botón desde
desde el
el layout
layout
Button button = (Button)findViewById(R.id.my_button);
Button button = (Button)findViewById(R.id.my_button);
//
// Registro
Registro del
del listener
listener para
para el
el evento
evento onClick
onClick
button.setOnClickListener(MyListener);
button.setOnClickListener(MyListener);
...
...
}}

Mp3Player © Grupo Arco 15


Desarrollo de
aplicaciones
Android

Eventos de la IU
Evento Listener Se produce ..

onClick View.OnClickListener Al pulsar la vista

onLongClick View.OnLongclick Con pulsación larga

onFocusChange View.OnFocusChangeListener Al recibir o abandonar el


foco
onKey View.OnKeyListener Al pulsar una tecla con la
vista seleccionada
onTouch View.OnTouchListener Al pulsar, soltar o hacer un
gesto sobre la pantalla
onCreateContextMenu View.OnCreateContextMenuListener Al crear un menú de
contexto por una pulsación
larga
View.setOn[Event]Listener

Mp3Player © Grupo Arco 16


Desarrollo de
aplicaciones
Android

Cuadros de diálogo
● Utilizados para solicitar información extra al
usuario o realizar notificaciones

Título: opcional

Contenido: depende del


tipo de diálogo

Botones: para el control


de acciones

Mp3Player © Grupo Arco 17


Desarrollo de
aplicaciones
Android

Tipos
● Alerts
● Popups
● Toasts

Mp3Player © Grupo Arco 18


Desarrollo de
aplicaciones
Android

AlertDialog
//
// La
La clase
clase AlertDialog.Builder
AlertDialog.Builder proporciona
proporciona una
una API
API para
para crear
crear cuadro
cuadro de
de diálogo
diálogo
de alerta
de alerta
AlertDialog.Builder
AlertDialog.Builder builder
builder == new
new AlertDialog.Builder(this);
AlertDialog.Builder(this);
//
// Los
Los métodos
métodos que
que fijan
fijan las
las características
características se
se pueden
pueden encadenar
encadenar
builder.setMessage("Are you sure you want to exit?")
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setCancelable(false)
.setPositiveButton("Yes",
.setPositiveButton("Yes", new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
MyActivity.this.finish();
MyActivity.this.finish();
}}
})
})
.setNegativeButton("No",
.setNegativeButton("No", new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
dialog.cancel();
dialog.cancel();
}}
});
});
//
// Por
Por último
último se
se realiza
realiza la
la instancia
instancia
AlertDialog alert = builder.create();
AlertDialog alert = builder.create();
//
// Para
Para mostrarlo
mostrarlo debe
debe invocarase
invocarase al
al método
método show()
show()
alert.show();
alert.show();

Mp3Player © Grupo Arco 19


Desarrollo de
aplicaciones
Android

AlertDialog con listas


final
final CharSequence[]
CharSequence[] items
items == {"Red",
{"Red", "Green",
"Green", "Blue"};
"Blue"};
...
...
builder.setTitle("Pick
builder.setTitle("Pick aa color");
color");
//
// single
single choice
choice list
list
builder.setItems(items,
builder.setItems(items, newnew DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int item)
item) {{
Toast.makeText(getApplicationContext(),
Toast.makeText(getApplicationContext(), items[item],
items[item],
Toast.LENGTH_SHORT).show();
Toast.LENGTH_SHORT).show();
}}
});
}); SetMultipleChoiceItems()
para checkboxes
//
// radio
radio buttons
buttons list
list
builder.setSingleChoiceItems(items,
builder.setSingleChoiceItems(items, -1, -1, new
new
DialogInterface.OnClickListener()
DialogInterface.OnClickListener() { {
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int item)
item) {{
Toast.makeText(getApplicationContext(),
Toast.makeText(getApplicationContext(), items[item],
items[item],
Toast.LENGTH_SHORT).show();
Toast.LENGTH_SHORT).show();
}}
});
});

Mp3Player © Grupo Arco 20


Desarrollo de
aplicaciones
Android

AlertDialog: otros tipos

ProgressDialog
ProgressDialog dialog
dialog == ProgressDialog.show(MyActivity.this,
ProgressDialog.show(MyActivity.this, "",
"",
"Loading. Please wait...", true);
"Loading. Please wait...", true);

ProgressDialog
ProgressDialog progressDialog;
progressDialog;
progressDialog
progressDialog = new
= new ProgressDialog(mContext);
ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
progressDialog.setCancelable(false);

Mp3Player © Grupo Arco 21


Desarrollo de
aplicaciones
Android

Fragmentos de diálogos
● Permiten crear diálogos a la medida
public
public class
class FireMissilesDialogFragment
FireMissilesDialogFragment extends
extends DialogFragment
DialogFragment {{
@Override
@Override
public
public Dialog
Dialog onCreateDialog(Bundle
onCreateDialog(Bundle savedInstanceState)
savedInstanceState) {{
AlertDialog.Builder
AlertDialog.Builder builder
builder == new
new AlertDialog.Builder(getActivity());
AlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_fire_missiles)
builder.setMessage(R.string.dialog_fire_missiles)
.setPositiveButton(R.string.fire,
.setPositiveButton(R.string.fire, new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
//
// FIRE
FIRE ZE
ZE MISSILES!
MISSILES!
}})
}})
.setNegativeButton(R.string.cancel,
.setNegativeButton(R.string.cancel, new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
//
// User
User cancelled
cancelled the
the dialog
dialog
}});
}});
return
return builder.create();
builder.create();
}}
}}

● Después basta con instanciar la clase e invocar a show()

Mp3Player © Grupo Arco 22


Desarrollo de
aplicaciones
Android

Diálogos con layout personalizado


● Se diseñar la apariencia como en cualquier
otro layout
● Se infla pasando al builder el nuevo layout
AlertDialog.Builder
AlertDialog.Builder builder
builder == new
new AlertDialog.Builder(getActivity());
AlertDialog.Builder(getActivity());
LayoutInflater
LayoutInflater inflater
inflater == getActivity().getLayoutInflater();
getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog_signin,
builder.setView(inflater.inflate(R.layout.dialog_signin, null));
null));
builder.setMessage(R.string.dialog_fire_missiles)
builder.setMessage(R.string.dialog_fire_missiles)
.setPositiveButton(R.string.fire,
.setPositiveButton(R.string.fire,
new
new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
...
...

Mp3Player © Grupo Arco 23


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 4
● Creación de una instancia del MediaPlayer
que inicie la reproducción de una canción fija al
pulsar un botón:
● Añadir un botón al layout del fragmento
● Crear una instancia estática del MediaPlayer
● Iniciar la reproducción del MediaPlayer al pulsar el
botón
● Detener la reproducción al abandonar la aplicación
(desde el menú)

Mp3Player © Grupo Arco 24


Desarrollo de
aplicaciones
Android

Reproducción de audio y vídeo


● Se realiza a través del objeto MediaPlayer
● Permite reproducir:
● Contenido local
● URIs internas
● URLs externas (streaming)

Mp3Player © Grupo Arco 25


Desarrollo de
aplicaciones
Android

MediaPlayer: permisos
● Hay ciertas características que requieren
permisos extras en el Manifest:
● Internet Permission: para reproducción en stream
<uses-permission
<uses-permission android:name="android.permission.INTERNET"
android:name="android.permission.INTERNET" />
/>

● Wake Lock Permission: para evitar el bloqueo de


pantalla o el paso a modo sleep del procesador
<uses-permission
<uses-permission android:name="android.permission.WAKE_LOC"
android:name="android.permission.WAKE_LOC" />
/>

● External Storage Permission: para acceder a la


tarjeta externa
<uses-permission
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:name="android.permission.READ_EXTERNAL_STORAGE" />
/>

Mp3Player © Grupo Arco 26


Desarrollo de
aplicaciones
Android

MediaPlayer
● Gestión basada en un
diagrama de estados
● Secuencia simple:
● reset(): paso a estado inicial
● setDataSource(): elección dela
fuente de reproducción
● prepare(): carga de la fuente
● start(): inicio de la reproducción
● pause()/stop(): pausa/parada de
la reproducción
● release(): liberación de recursos
del MediaPlayer

Mp3Player © Grupo Arco 27


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 5
● Adición de una nueva actividad que
proporcionará la canción a reproducir
● File=>New=>Activity=>Blank Activity
– Name: PlaylistActivity
– Resto por defecto
– Comprueba como se ha añadido la nueva actividad al
manifiesto de Android

Mp3Player © Grupo Arco 28


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 6
● Selección de la canción a partir de una lista fija
mostrada en la nueva actividad:
● Añadir al layout de la actividad una ListView (categoría
Composite de la paleta de la vista gráfica) con el id list
● Cambiar la herencia de la actividad PlayList de Activity a
ListActivity
● En el método onCreate() de la actividad añadir y conectar
a la ListView
– Un array de strings inicializada con 3 nombres de canciones
– Un adaptador de lista simple

Mp3Player © Grupo Arco 29


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 6
● ...:
● Añadir el método onListItemClick() a la actividad
para tratar la selección de la lista:
– Retornar un intent con el número de canción elegida
– Llamar a finish() para cerrar la actividad
● Cambiar la llamada startActivity() por
startActivityForResult()
● Implementar el método onActivityResult() para
recoger el valor el Intent y reproducir la canción

Mp3Player © Grupo Arco 30


Desarrollo de
aplicaciones
Android

Intent explícitos
● Permiten iniciar nuevas actividades
Intent
Intent ii == new
new Intent(this,
Intent(this, About.class);
About.class);

● Puede contener información adicional:


● Acción: string para especificar la acción a realizar
● Datos: para indicar una URI
● Categoría: del componente que debe gestionar el intent
● Extras: pares de tipo key-value para envío de información
extra
● A continuación se iniciará la tarea
startActivity(i);
startActivity(i);

Mp3Player © Grupo Arco 31


Desarrollo de
aplicaciones
Android

Intents: Paso de extras


● Se añaden datos extra al Intent de retorno con
métodos especializados:
● putExtra(String clave, <tipo> valor)
● putStringArrayListExtra(String clave,
ArrayList<String> valor)
● Nombre del paquete java como prefijo la clave
● También puede crearse un objeto Bundle que
integre todos los datos y después añadirlo al intent:
● putExtras(Bundle extras)

Mp3Player © Grupo Arco 32


Desarrollo de
aplicaciones
Android

Intents con respuesta


● Si la actividad a ejecutar devuelve resultados, debe
iniciarse con startActivityForResult()
● Primer argumento es el intent.
● Segundo argumento es el identificador de llamada
● Además debe implementarse en la actividad el callback
onActivityResult(), para recoger los resultados
@Override
@Override
public
public void
void onActivityResult(int
onActivityResult(int requestCode,int
requestCode,int resultCode,
resultCode, Intent
Intent data
data {{
super.onActivityResult(requestCode,
super.onActivityResult(requestCode, resultCode,
resultCode, data);
data);
switch(requestCode)
switch(requestCode) {{
case
case (ID_LLAMADA):{
(ID_LLAMADA):{
if
if (resultCode
(resultCode == == Activity.RESULT_OK)
Activity.RESULT_OK) {{
Bundle
Bundle bb == data.getExtras();
data.getExtras();
...
...
}}
};
};

Mp3Player © Grupo Arco 33


Desarrollo de
aplicaciones
Android

Retorno de valores
● Desde la actividad “llamada”
● Crear un intent de retorno
● Puede incluir nuevos extras
● Establecer el resultado actividad: SetResult()
– Código: e.j. RESULT_CANCELED, RESULT_OK.

Intent
Intent resultIntent
resultIntent == new
new Intent();
Intent();
resultIntent.putExtra("com.cep.mp3player.song",
resultIntent.putExtra("com.cep.mp3player.song", position);
position);
setResult(Activity.RESULT_OK,resultIntent);
setResult(Activity.RESULT_OK,resultIntent);
this.finish();
this.finish();

Mp3Player © Grupo Arco 34


Desarrollo de
aplicaciones
Android

Mostrar datos en el ListView


● La misma filosofía siempre:
● Desacoplar el contenedor y origen de los datos de
la presentación.

Datos Control
Adaptador
[Contenedor] [Presentación]

Vista
[Visualización
a medida]

Mp3Player © Grupo Arco 35


Desarrollo de
aplicaciones
Android

Mostrar datos en ListView (sencillo)


1. El contenedor
ArrayList<String> songsList = new ArrayList<String>();

2. El adaptador
ArrayAdapter<String> adapter;
● Enlazar contenedor-vista-lista-adaptador (onCreate)
Adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, songsList);
setListAdapter(adapter);
● Añadir datos (onActivityResult)
songsList.add(String);
adapter.notifyDataSetChanged();

Mp3Player © Grupo Arco 36


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 7
● Creación de la lista de canciones a partir del contenido de un
directorio:
● Obtener la lista de ficheros de un directorio del dispositivo de
almacenamiento externo (mediante la clase MediaManager que se
proporciona)
● Enviar la lista de los nombres de canciones a la actividad que la
muestra, a través de los argumentos del Intent
intent.putExtra("playlist", media_manager.songTitles());
● Recoger el índice de la canción seleccionada, obtener el fichero
fuente, y reproducir
Integer song = data.getIntExtra("com.cep.player.song", 0);
playSong(media_manager.getSong(song).path());

Mp3Player © Grupo Arco 37


Desarrollo de
aplicaciones
Android

MediaManager
● Gestiona el listado de canciones
Constructor que rellena el
Array song_files a partir
Del contenido de un directoru

class
class MediaManager
MediaManager {{
String
String music_path
music_path == Environment.getExternalStoragePublicDirectory(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MUSIC).getPath()
Environment.DIRECTORY_MUSIC).getPath() ++ '/';
'/';
File[] song_files;
File[] song_files;
Array con los títulos de
public
public MediaManager();
MediaManager(); Las canciones
public
public String[]
String[] songTitles();
songTitles();
public
public int
int size();
size();
Clase que gestiona los
public metadatos
public SongData
SongData getSong(int
getSong(int index);
index);
}}

Mp3Player © Grupo Arco 38


Desarrollo de
aplicaciones
Android

SongData
● Gestión de los metadatos de la canción

class
class SongData
SongData {{
MediaMetadataRetriever
MediaMetadataRetriever metadata;
metadata;
File file;
File file;
Constructor a partir de
public
public SongData(String
SongData(String path);
path); ruta
public
public SongData(File
SongData(File f);
f);
public
public String
String title();
title(); Constructor a partir de
public
fichero
public String
String album();
album();
public
public String
String path();
path();
public
public Bitmap
Bitmap picture();
picture();
private
private String
String pathToTitle(String
pathToTitle(String filename);
filename);
}}

Mp3Player © Grupo Arco 39


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 8
● Mejora de la interfaz de control del player mediante el uso
de 2 LinearLayout para la disposición de los componentes:
● El primero debe incluir
– el botón para la selección de la canción
– Un textview que anotará el nombre de la canción
● El segundo debe incluir otros 3 botones:
– Canción anterior (sin funcionalidad)
– Pausa/reproducción (tipo ToggleButton)
– Canción posterior (sin funcionalidad)
● Si la canción elegida en la lista es la que se haya en curso,
no reiniciar su reproducción

Mp3Player © Grupo Arco 40


Desarrollo de
aplicaciones
Android

Layouts
● Arquitectura de la IU en una Activity
● Estructura de la visualización
● Contenedor de los elementos visuales
Tipo Descripción

Lineal Los elementos se ubican en orden. Puede indicarse si


horizontalmente o verticalmente.
Table Los elementos se organizan en filas y dentro de cada
una, podemos ubicar varios elementos.
Absolute Se indican las coordenadas exactas donde deben
ubicarse los elementos
Relative Se especifica una posición relativa a otro elemento o
layout
Frame Los elementos pueden superponerse. El marco ocupa
toda la pantalla.

Mp3Player © Grupo Arco 41


Desarrollo de
aplicaciones
Android

LinearLayout
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_height="fill_parent">
<Button
<Button android:text="Button01"
android:text="Button01" android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
<Button
<Button android:text="Button02"
android:text="Button02" android:id="@+id/Button02"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
</LinearLayout>
</LinearLayout>

<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_height="fill_parent">
<Button
<Button android:text="Button01"
android:text="Button01" android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
<Button
<Button android:text="Button02"
android:text="Button02" android:id="@+id/Button02"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
</LinearLayout>
</LinearLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400

Mp3Player © Grupo Arco 42


Desarrollo de
aplicaciones
Android

TableLayout
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<TableLayout android:id="@+id/TableLayout01"
<TableLayout android:id="@+id/TableLayout01"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<TableRow
<TableRow android:id="@+id/TableRow01">
android:id="@+id/TableRow01">
<TextView
<TextView android:id="@+id/TextView01"
android:id="@+id/TextView01" android:text="First
android:text="First
Name:"
Name:"
android:width="100px"
android:width="100px" />
/>
<EditText
<EditText android:id="@+id/EditText01" android:width="220px"
android:id="@+id/EditText01" android:width="220px" />
/>
</TableRow>
</TableRow>
<TableRow
<TableRow android:id="@+id/TableRow02">
android:id="@+id/TableRow02">
<TextView
<TextView android:id="@+id/TextView02"
android:id="@+id/TextView02" android:text="Second
android:text="Second
Name:" />
Name:" />
<EditText
<EditText android:id="@+id/EditText02"
android:id="@+id/EditText02" />
/>
</TableRow>
</TableRow>
<TableRow
<TableRow android:id="@+id/TableRow03">
android:id="@+id/TableRow03">
<Button
<Button android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:text="Submit"
android:text="Submit" />
/>
<Button
<Button android:id="@+id/Button02"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" android:text="Reset"
android:text="Reset"
android:width="100px" />
android:width="100px" />
</TableRow>
</TableRow>
</TableLayout>
</TableLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400

Mp3Player © Grupo Arco 43


Desarrollo de
aplicaciones
Android

RelativeLayout
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/RelativeLayout01"
<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/TextView01"
<TextView android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="First Name:"
android:layout_height="wrap_content" android:text="First Name:"
android:width="100px" />
android:width="100px" />
<EditText android:id="@+id/EditText01" android:layout_width="220px"
<EditText android:id="@+id/EditText01" android:layout_width="220px"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/TextView01"
android:layout_toRightOf="@+id/TextView01"
android:layout_below="@+id/RelativeLayout01" />
android:layout_below="@+id/RelativeLayout01" />
<EditText android:id="@+id/EditText02" android:layout_width="220px"
<EditText android:id="@+id/EditText02" android:layout_width="220px"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/EditText01"
android:layout_below="@+id/EditText01"
android:layout_alignLeft="@+id/EditText01" />
android:layout_alignLeft="@+id/EditText01" />
<TextView android:id="@+id/TextView02"
<TextView android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Second Name:"
android:layout_height="wrap_content" android:text="Second Name:"
android:width="100px" android:layout_below="@+id/EditText01"
android:width="100px" android:layout_below="@+id/EditText01"
android:layout_toLeftOf="@+id/EditText02" />
android:layout_toLeftOf="@+id/EditText02" />
<Button android:text="Submit" android:id="@+id/Button01"
<Button android:text="Submit" android:id="@+id/Button01"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_below="@id/EditText02"
android:layout_below="@id/EditText02"
android:layout_alignLeft="@id/EditText02" />
android:layout_alignLeft="@id/EditText02" />
<Button android:text="Reset" android:id="@+id/Button02"
<Button android:text="Reset" android:id="@+id/Button02"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_below="@id/EditText02"
android:layout_below="@id/EditText02"
android:layout_alignRight="@id/EditText02" />
android:layout_alignRight="@id/EditText02" />
</RelativeLayout>
</RelativeLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
Mp3Player © Grupo Arco 44
Desarrollo de
aplicaciones
Android

AbsoluteLayout

<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<AbsoluteLayout android:id="@+id/AbsoluteLayout01"
<AbsoluteLayout android:id="@+id/AbsoluteLayout01"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
<EditText android:id="@+id/EditText01"
android:id="@+id/EditText01" android:layout_width="200px"
android:layout_width="200px"
android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_x="12px"
android:layout_x="12px"
android:layout_y="12px" />
android:layout_y="12px" />
<Button
<Button android:text="Search"
android:text="Search" android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="100px"
android:layout_width="100px"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_x="220px"
android:layout_x="220px" android:layout_y="12px"
android:layout_y="12px" />
/>
</AbsoluteLayout>
</AbsoluteLayout>

Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
Mp3Player © Grupo Arco 45
Desarrollo de
aplicaciones
Android

FrameLayout
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<FrameLayout
<FrameLayout android:id="@+id/FrameLayout01"
android:id="@+id/FrameLayout01"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
<ImageView android:id="@+id/ImageView01"
android:id="@+id/ImageView01"
android:src="@drawable/android"
android:src="@drawable/android"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
android:scaleType="center"
android:scaleType="center" />
/>
<TextView
<TextView android:text="Android
android:text="Android Partaker"
Partaker"
android:id="@+id/TextView01"
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dip"
android:layout_marginBottom="20dip"
android:layout_gravity="center_horizontal|bottom"
android:layout_gravity="center_horizontal|bottom"
android:padding="10dip"
android:padding="10dip"
android:textColor="#AA0000"
android:textColor="#AA0000" android:textStyle="bold"
android:textStyle="bold"
android:textSize="20px"
android:textSize="20px" android:background="#00000000" />
android:background="#00000000" />
</FrameLayout>
</FrameLayout>

Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
Mp3Player © Grupo Arco 46
Desarrollo de
aplicaciones
Android

Mp3Player: Paso 9
● Adición de funcionalidad a los botones prev. y
next
● Uso de una propiedad índice para almacenar la
canción actual
● Los botones provocan el cambio del índice con el
que obtener la nueva canción

Mp3Player © Grupo Arco 47


Desarrollo de
aplicaciones
Android

Mp3Player: Paso 10
● Visualización de los metadatos:
● Modificación del TextView para visualizar el nombre
del album y de la canción:
– Los datos pueden obtenerse a partir de los métodos
album() y title() de la clase SongData().
● Adición de un ImageView que contendrá la imagen
de la portada del álbum:
– Puede obtenerse del método picture()
– Para mostrar la imagen: setImageBitmap() en el
ImageView

Mp3Player © Grupo Arco 48

También podría gustarte