selenk selenk - 4 months ago 32
Android Question

How can I record voice in android as long as hold a button?

I want to record voice as long as holding the record button and save that voice into the raw folder in my project. I used the code below. Altough there appears no errors, i couldn't get any output. What can be the problem ? Do you have any suggestions? Thanks,

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;
}

Answer

here is your answer...

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;
        }
    }
}

AppLog.java file is

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);
}

the xml is

<?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>

Add these permission to your manifest file

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