viernes, 12 de julio de 2013

Sonido en Android. Un ejemplo sencillo

Sigo curioseando en Androd, hoy le toca al sonido. Tratando de ser lo más sencillo posible, en Android disponemos de dos posibilidades para reproducir sonido:

  • Cuando queremos reproducir ficheros pequeños (menos de 1 mb): Usaremos SounPool
  • Cuando queremos reproducir ficheros grandes (>1 mb): Usaremos AudioManager
Aquí nos vamos a centrar en el caso simple (SoundPool). A grandes rasgos, SoundPool es como su propio nombre indica una cola que contiene sonidos. Estos sonidos han de ser previamente cargados mediante el método "load" y luego los ejecutamos mediante el método "play".

OJO: la carga de los ficheros es asíncrona por lo que se puede dar un problema muy curioso (que he sufrido en mis propias carnes), si tenemos una linea en la que cargamos el sonido y la siguiente lo reproduce, veremos que MIENTRAS DEPURAMOS PASO A PASO, el sonido se reproduce, mientras que si lo EJECUTAMOS no se oye nada, esto se debe a que en tiempo de ejecución, el tiempo que tarde en pasar de una línea de código a la siguiente no es suficiente para que haya dado tiempo a cargar el sonido debido a que el proceso de carga es asíncrono.

Vamos al asunto:
Antes de nada, añadimos un fichero a la carpeta "raw" dentro de (src/main/res/raw en Android Studio), en nuestro caso hemos añadido alarma.mp3

Lo segundo que haremos será crear el objeto SoudPool en el evento oncreate del activity y cargaremos el sonido dejándolo listo para ser ejecutado, al pulsar un botón. Es importante cargar el sonido antes de ejecutarlo para prevenir lo que he comentado más arriba.

public class layout_Sonido extends Activity {
    //Sonido
    private SoundPool sp;
    private int sonidoAlarma;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_gps);
        //Creamos el Pool
        //el pool puede contener 5 ficheros de sonido
        sp = new SoundPool(5,AudioManager.STREAM_MUSIC,1);
        //Cargamos el sonido
        sonidoAlarma = sp.load(this,R.raw.alarma,1);
    }
El siguiente paso es ejecutar el sonido, para ello hemos de añadir la siguiente línea allá donde queramos utilizar el sonido:
sp.play(sonidoAlarma,1,1,1,0,1);


En el método play podemos fijar el volumen derecho, izquierdo, número de veces que se repetirá el sonido velocidad de reproducción, etc, para ello podemos revisar la documentación de este método.

miércoles, 10 de julio de 2013

Gateando en Android

Podría haber llamado a este artículo "primeros pasos con Android" pero cuando vienes de entornos Microsoft más que andar, gateas como puedes.
Quién dijo miedo habiendo hospitales, he instalado el recién salido del horno "Android Studio" proporcionado por Google y la verdad es que te lo pintan mucho mejor de lo que realmente es. Seguramente para aquellos que vienen de Eclipse el cambio es a mejor, pero de verdad, como programador MS, a mi me parece un auténtico infierno y cualquier cosa menos amigable, pero bueno, tiempo al tiempo que nadie nace sabido.
Resulta curioso que lo que a priori parece más sencillo es muy complejo y por suerte al contrario, por ejemplo:
marcar un número de teléfono
- Añadimos a AndroidManifest.xml
<uses-permission android:name="android.permission.CALL_PHONE" />
Con esto solicitamos el permiso para realizar llamadas - Allá donde queramos hacemos la llamada:
Intent callIntent = new Intent(Intent.ACTION_CALL);

callIntent.setData(Uri.parse("tel:XXXXXXXXX"));

startActivity(callIntent);

Donde XXXXXXXXX es el teléfono ¿sencillo no? Sin embargo, otras cosas como pasar de una pantalla (layout) a otra puede no ser tan sencillas o por lo menos poco intuitivas. Te puedes imaginar algo como show, load, etc pero no es algo así como:
Intent actividadGPS = new Intent(this, layout_GPS.class);

startActivity(actividadGPS);

y Aquí viene la nomenclatura y estructura de Android... Las actividades (Activity) y su ciclo de vida son algo novedoso para mí y que se debe comprender con profundidad, recomiendo para ello este excepcional artículo de jarroba: http://jarroba.com/activity-entender-y-usar-una-actividad/