I am a newbie in Android and I was trying to build an app to record audio data. I am using Eclipse Galileo IDE with ADT plugin. And my app is targetted for the Andriod 2.1 platform.
Unfortunately the example provided in the Dev Guide throws many exceptions.
For example:
to get MIME type the code uses recorder.getMimeContentType()
. But this method does not exist in my version of MediaRecorder
class.
I have searched online as well as this forum and came up with one or two alternatives which show how to record audio and place it in an EXISTING file. But ideally i want the code given in the dev guide to work.
Or even better if i can record the audio and store it directly in a byte array?
I have spent a lot of time trying to get this to work but with not much success :(
I would really appreciate if someone can show me how to achieve audio recording.
It has example code for recording an audio
b1=(Button)findViewById(R.id.button1);
b2=(Button) findViewById(R.id.button2);
mr=new MediaRecorder();
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
try{
b1.setEnabled(false);
b2.setEnabled(true);
b2.requestFocus();
start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try{
b1.setEnabled(true);
b2.setEnabled(false);
b1.requestFocus();
stop();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
processaudiofile();
}
});
b2.setEnabled(false);
b1.setEnabled(true);
}
protected void start() throws Exception
{
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
if (audiofile == null) {
File sampleDir = Environment.getExternalStorageDirectory();
try {
audiofile = File.createTempFile("Record", ".mp3", sampleDir);
}
catch (IOException e)
{
Log.e("abc","sdcard access error");
return;
}
}
mr.setOutputFile(audiofile.getAbsolutePath());
mr.prepare();
mr.start();
}
protected void stop() throws Exception{
mr.stop();
mr.release();
}
protected void processaudiofile() {
ContentValues values = new ContentValues(4);
long current = System.currentTimeMillis();
values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName());
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");
values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath());
ContentResolver contentResolver = getContentResolver();
Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Uri newUri = contentResolver.insert(base, values);
// this does not always seem to work cleanly....
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri));
}
You can try this code, for me it works well:
MediaRecorder recorder;
void startRecording() throws IOException
{
SimpleDateFormat timeStampFormat = new SimpleDateFormat(
"yyyy-MM-dd-HH.mm.ss");
String fileName = "audio_" + timeStampFormat.format(new Date())
+ ".mp4";
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/"+fileName);
recorder.prepare();
recorder.start();
}
protected void stopRecording() {
recorder.stop();
recorder.release();
}
Check this out: http://developer.android.com/guide/topics/media/audio-capture.html