Grabar audio en una aplicación del dispositivo BlackBerry

Los dispositivos BlackBerry que operan en redes CDMA pueden grabar audio en los siguientes formatos: AMR de 8 kHz mono, PCM de 16 bits, GSM 6.10 y QCELP. El formato predeterminado de grabación de audio es AMR.
  1. Importe las clases necesarias.
    import net.rim.device.api.ui.*;
    import net.rim.device.api.ui.container.*;
    import net.rim.device.api.ui.component.*;
    import java.io.*;
    import java.lang.*;
    import javax.microedition.media.*;
    import javax.microedition.media.control.*;
  2. Cree el marco de la aplicación ampliando la clase UiApplication. En main(), cree una instancia de la clase nueva e invoque enterEventDispatcher() para activar la aplicación para recibir eventos. En el constructor de la aplicación, invoque pushScreen() para mostrar la pantalla personalizada para la aplicación. La clase AudioRecordingDemoScreen, que se describe en el paso 3, representa la pantalla personalizada.
    public class AudioRecordingDemo extends UiApplication
    {
         public static void main(String[] args)
         {
              AudioRecordingDemo app = new AudioRecordingDemo();
              app.enterEventDispatcher();
         }
         public AudioRecordingDemo()
         {
              pushScreen(new AudioRecordingDemoScreen());
         }
    }
  3. Cree el marco para la pantalla personalizada ampliando la clase MainScreen. Declare una instancia de la clase AudioRecorderThread, como se describe en el paso 5.
    private class AudioRecordingDemoScreen extends MainScreen
    {	
        private AudioRecorderThread _recorderThread;
        public AudioRecordingDemoScreen()
        {
        }
    }
  4. En el constructor de la AudioRecordingDemoScreen, invoque setTitle() para especificar el título de la pantalla. Invoque addMenuItem() dos veces para agregar los elementos de menú que inician y detienen la grabación, como se describe en el paso 5.
    public AudioRecordingDemoScreen()
    {
       setTitle("Audio recording demo");
       addMenuItem(new StartRecording());
       addMenuItem(new StopRecording());
    }
  5. En la clase AudioRecordingDemoScreen, defina los elementos de menú que inician y detienen la grabación. Los elementos de menú invocan los métodos AudioRecorderThread.start() y AudioRecorderThread.stop(), que se describen en el paso 6. En el siguiente código de ejemplo, Player se inicia en su propio subproceso para aumentar la respuesta de los elementos de menú.
    private class StartRecording extends MenuItem 
    {
        public StartRecording() 
        {
            super("Start recording", 0, 100);
        }
        public void run() 
        {
            try 
            {
                AudioRecorderThread newRecorderThread = new AudioRecorderThread();
                newRecorderThread.start();
                _recorderThread = newRecorderThread;
            } 
            catch (Exception e) 
            {
                Dialog.alert(e.toString());
            }
        }
    }
    private class StopRecording extends MenuItem 
    {
        public StopRecording() 
        {
            super("Stop recording", 0, 100);
        }
        public void run() 
        {
             try 
             {
                 if (_recorderThread != null) 
                 { 
                     _recorderThread.stop();
                 }
             } 
             catch (Exception e) 
             {
                 Dialog.alert(e.toString());
             }
         }
    }
  6. En la clase Screen AudioRecordingDemo, defina una clase interna que amplíe Thread e implemente PlayerListener. En la clase interna, cree una variable del tipo Player y una variable del tipo RecordControl para grabar archivos multimedia.
    Nota: Tenga en cuenta que no es necesario que grabe el audio en un subproceso distinto, ya que las operaciones de grabación están encadenadas por defecto.
    private class AudioRecorderThread extends Thread implements javax.microedition.media.PlayerListener
    {
        private Player _player;
        private RecordControl _recordControl;
        AudioRecorderThread()
        {
        }
    }
  7. En la clase AudioRecorderThread, implemente el método Thread de la interfaz run(). Cree un bloque try/catch e invoque Manager.createPlayer(String locator) para crear un objeto Player para grabar audio, utilizando como parámetro un valor que especifique qué codificación utilizar.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://audio?encoding=audio/amr");
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  8. Invoque Player.addPlayerListener(). Especifique this como un parámetro porque AudioRecorderThread implementa PlayerListener.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://audio?encoding=audio/amr");
            _player.addPlayerListener(this);
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  9. Para grabar, invoque Player.realize() para inicializar el objeto RecordControl. A continuación, invoque Player.getControl("RecordControl") para recuperar el objeto RecordControl.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://audio?encoding=audio/amr");
            _player.addPlayerListener(this);
            _player.realize();
            _recordControl = (RecordControl) _player.getControl("RecordControl" );
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  10. Invoque RecordControl.setRecordLocation() para especificar dónde debe guardar el dispositivo la grabación de audio.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://audio?encoding=audio/amr");
            _player.addPlayerListener(this);
            _player.realize();
            _recordControl = (RecordControl) _player.getControl( "RecordControl" );
            _recordControl.setRecordLocation("file:///store/home/user/AudioRecordingTest.amr" );    
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  11. Invoque RecordControl.startRecord() para empezar a grabar el audio y para empezar a reproducir el contenido multimedia. Invoque Player.start() para iniciar Player.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://audio?encoding=audio/amr");
            _player.addPlayerListener(this);
            _player.realize();
            _recordControl = (RecordControl) _player.getControl( "RecordControl" );
            _recordControl.setRecordLocation("file:///store/home/user/AudioRecordingTest.amr" );
            _recordControl.startRecord(); 
            _player.start();
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  12. En AudioRecorder, implemente el método Thread de la interfaz stop(). Compruebe que Player no sea null e invoque Player.close() para iniciar los recursos del objeto Player. Defina Player en null.
    public void stop() 
    {
        if (_player != null) 
        {
            _player.close();
            _player = null;
        }
    }
  13. Compruebe que RecordControl no sea null e invoque RecordControl.stopRecord() para detener la grabación. En un bloque try/catch, invoque RecordControl.commit() para guardar la grabación en un archivo específico. Defina RecordControl en null.
    public void stop() 
    {
        if (_recordControl != null) 
        {
            _recordControl.stopRecord();
            try 
            {
                _recordControl.commit();
            } 
            catch (Exception e) 
            {
                Dialog.alert(e.toString());
            }
            _recordControl = null;
        }
        if (_player != null) 
        {
            _player.close();
            _player = null;
        }
    }
  14. En AudioRecorderThread, implemente PlayerListener.playerUpdate(). Este método se invoca cuando el objeto Player genera un evento. En el siguiente código de ejemplo, la aplicación produce información sobre el evento.
    public void playerUpdate(Player player, String event, Object eventData) 
    {
        Dialog.alert("Player " + player.hashCode() + " got event " + event + ": " + eventData);
    }

¿Le ha resultado útil esta información? Envíenos sus comentarios.