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;
}
Tap Record . Your phone will record, even if the screen goes to sleep. While recording, you'll see a "Currently recording" message in your notifications. You can record up to 18 hours on a single recording.
Does Android Have a Built-In Voice Recorder? Yes, your Android phone has a built-in voice recorder app. You can find it by searching for Sound Recorder in your apps. Swipe up from your phone's home screen if you're using an older version of Android.
you can use the library that i have made RecordView
it's easy to setup and it's simulates the same behavior like WhatsApp.
Simply add the Views RecordView
and RecordButton
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/parent_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.devlomi.recordview.MainActivity">
<com.devlomi.record_view.RecordView
android:id="@+id/record_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@id/record_button"
app:slide_to_cancel_arrow="@drawable/ic_keyboard_arrow_left"
app:slide_to_cancel_text="Slide To Cancel"
app:slide_to_cancel_margin_right="10dp"/>
<com.devlomi.record_view.RecordButton
android:id="@+id/record_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="@drawable/bg_mic"
android:scaleType="centerInside"
app:src="@drawable/ic_mic_white"
/>
then in your Activity
RecordView recordView = (RecordView) findViewById(R.id.record_view);
RecordButton recordButton = (RecordButton)
findViewById(R.id.record_button);
//IMPORTANT
recordButton.setRecordView(recordView);
lastly you can handle the Record States
onLessThanSecond when the record time <= 1Second
recordView.setOnRecordListener(this);
@Override
public void onStart() {
//Start Recording..
Log.d("RecordView", "onStart");
}
@Override
public void onCancel() {
//On Swipe To Cancel
Log.d("RecordView", "onCancel");
}
@Override
public void onFinish(long recordTime) {
//Stop Recording..
String time = getHumanTimeText(recordTime);
Log.d("RecordView", "onFinish");
Log.d("RecordTime", time);
}
@Override
public void onLessThanSecond() {
//When the record time is less than One Second
Log.d("RecordView", "onLessThanSecond");
}
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();
return true;
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With