2012-06-20 16 views
8

Quiero grabar la voz siempre que mantenga presionado el botón de grabación y guarde esa voz en la carpeta sin editar de mi proyecto. Usé el código a continuación. A pesar de que no aparece ningún error, no pude obtener ningún resultado. Cual puede ser el problema ? ¿Tienes alguna sugerencia? Gracias,¿Cómo puedo grabar voz en Android siempre que mantenga presionado un botón?

public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 


    Runnable mAction = new Runnable() { 
     public void run() { 
      System.out.println("Performing action..."); 

      int frequency=11025; 
      int channelConfiguration=AudioFormat.CHANNEL_CONFIGURATION_MONO; 
      int audioEncoding= AudioFormat.ENCODING_PCM_16BIT; 
      File file=new File(Environment.getExternalStorageDirectory(),"raw.pcm"); 

      try{ 
       file.createNewFile(); 
      }catch(IOException e){} 

      try{ 
       OutputStream os=new FileOutputStream(file); 
       BufferedOutputStream bos=new BufferedOutputStream(os); 
       DataOutputStream dos=new DataOutputStream(bos); 

       int bufferSize=AudioRecord.getMinBufferSize(frequency, channelConfiguration, 
         audioEncoding); 

       short[] buffer=new short[bufferSize]; 
       audioRecorder=new AudioRecord(MediaRecorder.AudioSource.MIC, 
         frequency, channelConfiguration, audioEncoding, bufferSize); 

       audioRecorder.startRecording(); 

       isRecording=true; 

       while(isRecording){ 

        int         bufferReadResult=audioRecorder.read(buffer, 0,bufferSize); 

        for(int i=0;i<bufferReadResult;i++){ 

         dos.writeShort(buffer[i]); 

        } 

       } 

       audioRecorder.stop(); 
       dos.close(); 

      }catch(Throwable t){} 

     } 
    }; 

    switch(event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     if (myHandler != null) return true; 
     myHandler = new Handler(); 
     myHandler.postDelayed(mAction, 500); 
     break; 
    case MotionEvent.ACTION_UP: 

     if (myHandler == null) return true; 


     isRecording=false; 

     myHandler.removeCallbacks(mAction); 
     myHandler = null; 
     break; 
    } 

    return false; 
} 

Respuesta

24

aquí es su respuesta ...

import java.io.File; 
import java.io.IOException; 
import android.app.Activity; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 

public class AudioOnTouchActivity extends Activity { 
    Button b1; 
    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp"; 
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4"; 
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder"; 
    private MediaRecorder recorder = null; 
    private int currentFormat = 0; 
    private int output_formats[] = { MediaRecorder.OutputFormat.MPEG_4,    MediaRecorder.OutputFormat.THREE_GPP }; 
    private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP }; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     b1=(Button)findViewById(R.id.button1); 
     b1.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       // TODO Auto-generated method stub 
       switch(event.getAction()){ 
       case MotionEvent.ACTION_DOWN: 
        AppLog.logString("Start Recording"); 
        startRecording(); 
        break; 
       case MotionEvent.ACTION_UP: 
        AppLog.logString("stop Recording"); 
        stopRecording(); 
        break; 
       } 
       return false; 
      } 
     }); 
    } 

    private String getFilename(){ 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath,AUDIO_RECORDER_FOLDER); 

     if(!file.exists()){ 
      file.mkdirs(); 
     } 

     return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); 
    } 

    private void startRecording(){ 
     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(output_formats[currentFormat]); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(getFilename()); 
     recorder.setOnErrorListener(errorListener); 
     recorder.setOnInfoListener(infoListener); 

     try { 
      recorder.prepare(); 
      recorder.start(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() { 
      @Override 
      public void onError(MediaRecorder mr, int what, int extra) { 
       AppLog.logString("Error: " + what + ", " + extra); 
     } 
    }; 

    private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() { 
     @Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
       AppLog.logString("Warning: " + what + ", " + extra); 
     } 
    }; 

    private void stopRecording(){ 
     if(null != recorder){ 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 

      recorder = null; 
     } 
    } 
} 

archivo AppLog.java es

import android.util.Log; 

public class AppLog { 
private static final String APP_TAG = "AudioRecorder"; 

public static int logString(String message){ 
    return Log.i(APP_TAG,message); 
} 

el xml es

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:layout_gravity="center" 
     android:layout_marginTop="10dp"/> 

</LinearLayout> 

agregar estos permisos para el archivo de manifiesto

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
     <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 
+1

Gracias por su ayuda – selenk

+3

Habría sido mejor vincular a la fuente y explicar las partes relevantes del código en lugar de copiar pegar: https://github.com/krvarma/krvarma-android-samples/tree/master/AudioRecorder. 1 –

1
save that voice into the raw folder in my project. 

En tiempo de ejecución no se puede guardar en la carpeta Contenido crudo.

Tiene 2 opciones para guardarlo en el almacenamiento externo (si corresponde) o en getFileDir, es decir, en /data/data/package directory.

+0

¿Podría explicar la segunda opción? – selenk

1

puede llevar ayuda desde este código

AudioRecorderActivity.java

public class AudioRecorderActivity extends Activity { 
    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp"; 
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4"; 
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder"; 
    private MediaRecorder recorder = null; 
    private int currentFormat = 0; 
    private int output_formats[] = { 
     MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.OutputFormat.THREE_GPP 
    }; 
    private String file_exts[] = { 
     AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setButtonHandlers(); 
     enableButtons(false); 
     setFormatButtonCaption(); 
    } 

    private void setButtonHandlers() { 
     ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick); 
     ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick); 
     ((Button) findViewById(R.id.btnFormat)).setOnClickListener(btnClick); 
    } 

    private void enableButton(int id, boolean isEnable) { 
     ((Button) findViewById(id)).setEnabled(isEnable); 
    } 

    private void enableButtons(boolean isRecording) { 
     enableButton(R.id.btnStart, !isRecording); 
     enableButton(R.id.btnFormat, !isRecording); 
     enableButton(R.id.btnStop, isRecording); 
    } 

    private void setFormatButtonCaption() { 
     ((Button) findViewById(R.id.btnFormat)).setText(getString(R.string.audio_format) + " (" + file_exts[currentFormat] + ")"); 
    } 

    private String getFilename() { 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath, AUDIO_RECORDER_FOLDER); 

     if (!file.exists()) { 
      file.mkdirs(); 
     } 

     return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); 
    } 

    private void startRecording() { 
     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(output_formats[currentFormat]); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(getFilename()); 
     recorder.setOnErrorListener(errorListener); 
     recorder.setOnInfoListener(infoListener); 

     try { 
      recorder.prepare(); 
      recorder.start(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void stopRecording() { 
     if (null != recorder) { 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 

      recorder = null; 
     } 
    } 

    private void displayFormatDialog() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     String formats[] = { 
      "MPEG 4", "3GPP" 
     }; 

     builder.setTitle(getString(R.string.choose_format_title)).setSingleChoiceItems(formats, currentFormat, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       currentFormat = which; 
       setFormatButtonCaption(); 

       dialog.dismiss(); 
      } 
     }).show(); 
    } 

    private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {@Override 
     public void onError(MediaRecorder mr, int what, int extra) { 
      AppLog.logString("Error: " + what + ", " + extra); 
     } 
    }; 

    private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {@Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
      AppLog.logString("Warning: " + what + ", " + extra); 
     } 
    }; 

    private View.OnClickListener btnClick = new View.OnClickListener() {@Override 
     public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.btnStart: 
       { 
        AppLog.logString("Start Recording"); 

        enableButtons(true); 
        startRecording(); 

        break; 
       } 
      case R.id.btnStop: 
       { 
        AppLog.logString("Start Recording"); 

        enableButtons(false); 
        stopRecording(); 

        break; 
       } 
      case R.id.btnFormat: 
       { 
        displayFormatDialog(); 

        break; 
       } 
      } 
     } 
    }; 
} 

AppLog.java

import android.util.Log; 

public class AppLog { 
    private static final String APP_TAG = "AudioRecorder"; 

    public static int logString(String message) { 
     return Log.i(APP_TAG, message); 
    } 
}  

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="20dip" > 

    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitCenter" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 
     <Button 
      android:id="@+id/btnStart" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="@string/start_recording" /> 
     <Button 
      android:id="@+id/btnStop" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="@string/stop_recording" /> 
     <Button 
      android:id="@+id/btnFormat" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="Format (mp4)" /> 
    </LinearLayout> 

</LinearLayout> 
+0

Soy nuevo en esto, así que es difícil para mí encontrar mis errores. Sin embargo, supongo que no puedo crear el archivo. esta vez, cuando presiono el botón de grabación, dice que la aplicación se detuvo inesperadamente. – selenk

Cuestiones relacionadas