En esta unidad veremos instrucciones trabajar el audio en android.

Proyecto 0021

En Android es posible incluir audio en las apps tanto archivos te tamaño pequeño o grandes, hay dos clases que permiten esto:

La clase MediaPlayer
La clase SoundPool

La clase SoundPool es usada para audio corto, tales como sonido de acción de los botones, el archivo de audio debe de tener como m´aximo un tamaño de 1Mb.

Por su parte la clase MediaPlayer es para reproducir audio extenso.

Haremos una app con los los 2 ejemplos un botón para cada caso

para realizar esto necesitamos 2 archivos de audio en formato mp3 uno que sea corto el tiempo de ejecución y el otro larga ejecución, el nombre de estos archivos deber´an estar en minúsculas, puedes seleccionar cualquier sonido desde la pagina : http://sonidosmp3gratis.com/

ya habiendo descargado los archivos de mp3, podemos renombrarlos con los palabras  corto y largo para distinguirlos

a continuación los copiamos desde este directorio

Y ejecutamos Andriod Studio usando el nombre como proyecto 0021

ya estando en Android Studio pasamos a la sección Andriod y app > res

  ahí hacemos clic con el botón izquierdo del ratón y seleccionamos  New > Directory



Donde crearemos un directorio llamado raw, no debe ser diferente

ya teniendo el directorio creado hacemos clic con el botón derecho del ratón y buscamos la opción paste (pegar), que pasara la ruta de los archivos de audio copiados anteriormente

solo realizamos un clic en el botón OK.

  aquí vemos los archivos seleccionados de audio

pasemos al desarrollo de la app, usemos 2 botones en la app quedando de la siguiente forma:



usamos el ya conocido archivo de string.xml, para crear las referencias de los botones:

<resources>
    <string name="app_name">proyecto0021</string>
    <string name="SoundPool">Sound Pool</string>
    <string name="MediaPlayer">Media Player</string>
</resources>


agregamos el Id al primer botón (solo sera a este elemento)

pasamos a la parte lógica

la primer parte es definir estas funciones.

package com.example.dell.proyecto0021;

import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button play;
    SoundPool sp;
    int Sonido_de_Reproduccion;



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

considere las funciones que se importan (Alt - Enter)

la secuencia completa es:

package com.example.dell.proyecto0021;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button play;
    SoundPool sp;
    int Sonido_de_Reproduccion;


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

        play = (Button)findViewById(R.id.button_play);
        sp = new SoundPool(1, AudioManager.STREAM_MUSIC,1); //los parametros son
                                                                                                            // no. maximo de reproducciones en este caso 1 vez maxStream
                                                                                                           // Funcion que realizara AudioManager.STREAM_MUSIC
                                                                                                           // la calidad del audio es 1 (muy buena)


        Sonido_de_Reproduccion =sp.load(this,R.raw.corto_resorte,1);// los parametros son
                                                                                                            // this se refiere a un objeto
                                                                                                            //R.raw tomar del directorio raw el archivo de audio corto_resorte
                                                                                                            // y la prioridad de ejecucion 1


        }

        public void AudioSoundpool(View view){
        sp.play(Sonido_de_Reproduccion,1,1,1,0,0); //los parametros son para el volumen izq. y der.
                                                                                // prioridad 1 maxima prioridad
                                                                               // loop las veces que se repetira 0 es una sola ocacion, si se le pone 1 se repetira despues de la inicial
                                                                              //rate es pra qu e se reprodusca de forma normal (2 o mas es mas rapido)

           }
        public void AudioMediaPlayer (View view){
        MediaPlayer mp = MediaPlayer.create(this,R.raw.largo_mision_imposible);
        mp.start();
        }

}

regresamos a diseño y asociamos los botones a los métodos

 

ejecute el proyecto y revise el resultado

Proyecto 0022

Reproductor de música

Existen muchos reproductores de música disponibles para Android, pero para poder aplicar los conocimientos adquiridos hasta ahora, haremos un reproductor de música, para ello necesitaremos 2 cosas:

1.- Im´agenes con las figuras de los botones de anterior, background (fondo), detener, repetir, pausa, 3 portadas para los fondos de pantalla para identificar cada melodía, repetir, reproducir y siguiente.

2.- Las melodías (canciones),.

En ambos casos podr´as descargarlos desde este enlace el archivo comprimido llamado Material.rar

Para este caso solo deber´an tener instalado el Winrar (lo puedes descargar de www.winrar.com)

Ahí estar´an los dos elementos que requerimos para este proyecto:

para las im´agenes


y para las melodías (canciones):


Comencemos  con la aplicación, usemos el métodos para crear nuestra activity con el nombre proyecto0022.

Copiamos del directorio las im´agenes

Tal como en los casos anteriores debemos "copiar" las im´agenes al directorio res > drawable > paste



aplicamos en OK

  y de nuevo aplicamos en OK


Ahora agregaremos los archivos de audio usando la secuencia de app > res > New > Directory y se llamara raw




Ya teniendo el directorio regresamos al directorio donde se encuentran las melodías (canciones), copiamos estos archivos, regresamos a andriod_studio y pasamos al directorio raw creado anteriormente, ahí realizamos el proceso de paste.


aplicamos el botón OK



Para continuar pasamos al ´area de activity main y usamos los atributos y seleccionamos background


Usamos el control de backgorund (...) el cual nos llevara al menú Drawable  > Project y ahí tomamos background



el resultado de esto:


usamos de a paleta de controles Common > ImageView , soltamos el control en el ´area del la activity, donde se mostrara :




la seleccion es en Drawable > Project > portada1


Realizamos el ajuste de la imagen y las distancia con blueprint.


Regresamos a Desing (diseño), procure que el ajuste de la imagen se vea algo como la imagen inferior.


Agregamos el nombre a contentDescription (usamos Crtl+ Espacio) seleccionando @string/app_name




Agregaremos botones para los controles de reproducción de melodías, esto los agregaremos con la paleta Common > Button, debemos de hacer esto no con el proceso anterior de button hay diferencia entre estos 2 controles de paleta, el que se esta indicando es modificable de forma din´amica, y hacemos los cambios siguientes: ID btn_play, layout_50dpy layout_height ser´an 50dp y en TextView text lo dejaremos vacio.



En atributos seleccionamos background, seleccionamos la imagen "reproducir" para asignar el botón de play y la figura tal como se ve abajo



el efecto se vera la forma:




el proceso lo repetimos para los botones que se ven en la imagen siguiente:


puede distribuir los botones inferiores de mejor manera que se vean de forma correcta en su celular.

Terminando esta parte pasamos al la parte lógica MainActivity.java para el desarrollo de la app.

package com.example.dell.proyecto0022;

import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //creacion de objetos y variables a usar
    //botones dinamicos "cambian de forma cuando se aplican"
    Button play_pause,btn_repetir;
    MediaPlayer mp;
    ImageView iv;
    int repetir =2,posicion=0;

    MediaPlayer vectormp [] = new MediaPlayer[3];// 3 es porque son 3 melodías, si necesitan mas se cambia este valor (es un ejemplo pequeño)

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

        play_pause = (Button)findViewById(R.id.btn_play);
        btn_repetir = (Button)findViewById(R.id.btn_repetir);
        iv = (ImageView)findViewById(R.id.imageView);
        //se crea un vector para 3 posiciones
        vectormp[0] = MediaPlayer.create(this,R.raw.race);
        vectormp[1] = MediaPlayer.create(this,R.raw.sound);
        vectormp[2] = MediaPlayer.create(this,R.raw.tea);

    }
    //metodo para el boton PlayPause
    public void PlayPause (View view){
        if(vectormp[posicion].isPlaying()){ //verifica si esta en reproduccion
           vectormp[posicion].pause();
           play_pause.setBackgroundResource(R.drawable.reproducir);
            Toast.makeText(this,"Pausa",Toast.LENGTH_SHORT).show();
        }else{
            vectormp[posicion].start(); //si no esta en reproduccion
            play_pause.setBackgroundResource(R.drawable.pausa);
            Toast.makeText(this,"Play",Toast.LENGTH_SHORT).show();
        }  //termina else
    }
    //metodo para el boton stop
    public void Stop(View view){
        if(vectormp[posicion] != null){
            vectormp[posicion].stop();

            vectormp[0] = MediaPlayer.create(this,R.raw.race);
            vectormp[1] = MediaPlayer.create(this,R.raw.sound);
            vectormp[2] = MediaPlayer.create(this,R.raw.tea);
            posicion =0;
            play_pause.setBackgroundResource(R.drawable.reproducir);
            iv.setImageResource(R.drawable.portada1); //activar la portada
            Toast.makeText(this,"Stop",Toast.LENGTH_SHORT).show();


        }
    }
     //metodo repetir una pista
    public void Repetir(View view){
        if(repetir ==1){
             btn_repetir.setBackgroundResource(R.drawable.no_repetir); //del lado izquierdo esta la figura de repetir
             Toast.makeText(this, "No repetir",Toast.LENGTH_SHORT).show();
             vectormp[posicion].setLooping(false);
             repetir = 1;
        }else{

        }
    }
      // metodo para saltar a la siguiente melodia
    public void Siguiente(View view){
        if(posicion < vectormp.length -1){

            if(vectormp[posicion].isPlaying()){
                vectormp[posicion].stop();
                posicion ++;
                vectormp[posicion].start();

                if(posicion ==0){
                    iv.setImageResource(R.drawable.portada1);
                }else if(posicion ==1){
                    iv.setImageResource(R.drawable.portada2);
                }else if(posicion ==2){
                    iv.setImageResource(R.drawable.portada3);
                }

            }else {
                posicion++;

                if(posicion ==0){
                    iv.setImageResource(R.drawable.portada1);
                }else if(posicion ==1){
                    iv.setImageResource(R.drawable.portada2);
                }else if(posicion ==2){
                    iv.setImageResource(R.drawable.portada3);
                }
            }
        }else{
         Toast.makeText(this,"No hay canciones",Toast.LENGTH_SHORT).show();

        }
    }
    //metodo para regresar a la cancion anterior
    public void Anterior(View view){
        if(posicion >= 1){   //verificar que no avance mas o menos de las que existen

            if(vectormp[posicion].isPlaying()){
                vectormp[posicion].stop(); //es necesario porque si se esta reproduciendo una melodia detenerla
                vectormp[0] = MediaPlayer.create(this,R.raw.race);
                vectormp[1] = MediaPlayer.create(this,R.raw.sound);
                vectormp[2] = MediaPlayer.create(this,R.raw.tea);
                posicion--; //resta en una posicion la melodia que se esta reproduciendo

                if(posicion ==0){
                    iv.setImageResource(R.drawable.portada1);
                }else if(posicion ==1){
                    iv.setImageResource(R.drawable.portada2);
                }else if(posicion ==2){
                    iv.setImageResource(R.drawable.portada3);
                }


                vectormp[posicion].start();

            }else{
            posicion--;

                if(posicion ==0){
                    iv.setImageResource(R.drawable.portada1);
                }else if(posicion ==1){
                    iv.setImageResource(R.drawable.portada2);
                }else if(posicion ==2){
                    iv.setImageResource(R.drawable.portada3);
                }
            }

        }else{
        Toast.makeText(this,"No hay mas canciones",Toast.LENGTH_SHORT).show();
        }
    }

}

Por ultimo se asignamos a cada boton su evento en Design

 

 

 

Proyecto 0023

Grabadora de audio

Primeramente necesitamos el material para trabajo que son im´agenes tal como el ejemplo anterior material_grabacion_audio.rar

Descarga el archivo comprimido y descomprime con winrar dejarlos en un directorio especifico que ubiques f´acilmente.

Para realizar este proyecto esto es necesario usar la clase MediaRecorder se utiliza para grabar Audio y Video en diferentes formatos que se codifican cuando se almacenan.

Antes de poder iniciar la aplicación el usuario deber´a de autorizar el proceso de almacenamiento de información ya que se altera el contenido del sistema, lo cual se presentara antes de iniciar la grabación y solo sera una sola ocasión, esto se presentara en 2 pasos, debemos de aceptar los mensajes para que pueda grabar ya sea la imagen o audio.

Iniciamos seleccionando los archivos que descargamos anteriormente e indique copiar.



Desplegamos  app > res > drawable, al abrirlo, botón derecho e indicamos pegar




 




Establecemos el fondo de la app (background)


Agregamos un ImageView

al agregar ImageView nos llevara a la siguiente ventana, seleccionamos la imagen android


ingresamos la imagen al diseño de la app, y realizamos ajuste de la ImageView:


Agregamos en contentDescription

 

Agregamos 2 controles de botones, y ajustamos las distancias.


el botón del lado izquierdo los asignamos en ID btn_rec y del lado derecho su ID btn_play


establecemos layout_width a 128dp, y layout_height a 128dp, y al botón btn_rec, se agrega la imagen en background stop_rec, ajustamos el botón, lo subimos un poco, y borramos el TextView en Text lo dejamos vacío para retirar el nombre button.


 



Para el segundo botón usamos layout_width a 128dp, y layout_height a 128dp, y al botón btn_play, se agrega la imagen en background reproducir, ajustamos el botón, lo subimos un poco, y borramos el TextView en Text lo dejamos vacío para retirar el nombre button.



Modificaremos el archivo colors.xml modificamos los valores de los colores a los siguientes valores y su resultado en colores se ve del lado derecho


<?xml version="1.0" encoding="utf-8"?>                                               
<resources>
    <color name="colorPrimary">#8BC34A</color>
    <color name="colorPrimaryDark">#689F38</color>
    <color name="colorAccent">#8BC34A</color>
</resources>


Ya teniendo esto pasamos a la parte lógica de la app

package com.example.dell.proyecto0023;

import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private MediaRecorder grabacion;
    private String archivoSalida = null; //es para asignarle un nombre a la pista de audio
    private Button btn_recorder;

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

        btn_recorder = (Button) findViewById(R.id.btn_rec);

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 1000);
        }

    }

    public void Recorder(View view) {
        if (grabacion == null) {
            archivoSalida = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Grabacion.mp3"; //tambien en formato .3gp
            grabacion = new MediaRecorder();
            grabacion.setAudioSource(MediaRecorder.AudioSource.MIC);
            grabacion.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// gpp esta relacionado con el formato .mp3
            grabacion.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); //con esto termina el encoder
            grabacion.setOutputFile(archivoSalida);

            try {
               grabacion.prepare();
               grabacion.start();

            } catch (IOException e){

            }
            btn_recorder.setBackgroundResource(R.drawable.rec);
            Toast.makeText(getApplicationContext(),"Grabando ...",Toast.LENGTH_SHORT).show();
        }else if(grabacion != null){ //al presionar el mismo boton se detiene la grabacion
        grabacion.stop();
        grabacion.release();
        grabacion = null;
        btn_recorder.setBackgroundResource(R.drawable.stop_rec);
        Toast.makeText(getApplicationContext(),"Grabacion Finalizada ..",Toast.LENGTH_SHORT).show();
        }
    }
    //metodo para reproducir audio
    public void Reproducir(View view){
        MediaPlayer mediaPlayer = new MediaPlayer();
        try{
        mediaPlayer.setDataSource(archivoSalida);
        mediaPlayer.prepare();
        }catch (IOException e){

        }
        mediaPlayer.start();
        Toast.makeText(getApplicationContext(),"Reproducir Audio",Toast.LENGTH_SHORT).show();
    }
}

Pasamos ahora a Manifiest y agregamos las lineas siguientes (Manifiest es para permitir ciertos procesos o escrituras de archivos en android)


Agregamos lo metodos que se crearon

   



REFERENCIAS

Proyecto0021
https:https://developer.android.com/guide/topics/media/mediaplayer
http://www.androidcurso.com/index.php/recursos/37-unidad-6-multimedia-y-ciclo-de-vida/168-introduciendo-efectos-de-audio-con-soundpool
https://developer.android.com/reference/android/media/SoundPool
Proyecto0022
https://www.androidpit.es/mejores-reproductores-musica-para-android
https://androidstudiofaqs.com/tutoriales/crear-reproductor-musica-android-studio
https://code.tutsplus.com/es/tutorials/create-a-music-player-on-android-project-setup--mobile-22764
Proyecto0023
http://www.androidcurso.com/index.php/recursos/37-unidad-6-multimedia-y-ciclo-de-vida/169-grabacion-de-audio
https://www.video2brain.com/mx/tutorial/programando-nuestra-app-para-grabar-audio