I'm making a simple test application that has four buttons, start recording, stop recording, play, and stop.
The problem is I'm not able to hear any recordings and I'm not even sure that the recordings are being saved.
Here is my activities code
public class MainActivity extends Activity {
private MediaPlayer mediaPlayer;
private MediaRecorder recorder;
private String OUTPUT_FILE;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OUTPUT_FILE = Environment.getExternalStorageDirectory()+"/audiorecorder.3gpp";
}
public void buttonTapped (View view){
switch(view.getId()){
case R.id.btn_start_recording:
try{
beginRecording();
} catch (Exception e){
e.printStackTrace();
}
case R.id.btn_stop_recording:
try{
stopRecording();
} catch (Exception e){
e.printStackTrace();
}
case R.id.btn_play:
try{
playRecording();
} catch (Exception e){
e.printStackTrace();
}
case R.id.btn_stop:
try{
stopPlayback();
} catch (Exception e){
e.printStackTrace();
}
}
}
private void stopPlayback() {
if(mediaPlayer != null)
mediaPlayer.stop();
}
private void playRecording() throws Exception{
ditchMediaPlayer();
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(OUTPUT_FILE);
mediaPlayer.prepare();
mediaPlayer.start();
}
private void ditchMediaPlayer() {
if(mediaPlayer != null){
try{
mediaPlayer.release();
}catch(Exception e){
e.printStackTrace();
}
}
}
private void stopRecording() {
if(recorder != null)
recorder.stop();
}
private void beginRecording() throws Exception {
ditchMediaRecorder();
File outFile = new File(OUTPUT_FILE);
if(outFile.exists())
outFile.delete();
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioEncoder(MediaRecorder.getAudioSourceMax());
recorder.setAudioEncodingBitRate(16);
recorder.setAudioSamplingRate(44100);
recorder.setOutputFile(OUTPUT_FILE);
recorder.prepare();
recorder.start();
}
private void ditchMediaRecorder() {
//if we have the recorder, release it
if(recorder != null)
recorder.release();
}
}
The type of errors I'm getting
04-13 15:07:56.618: W/System.err(2542): java.io.IOException: Prepare failed.: status=0x1
04-13 15:07:56.618: W/System.err(2542): at android.media.MediaPlayer.prepare(Native Method)
04-13 15:07:56.618: W/System.err(2542): at com.appulse.audiomate.MainActivity.playRecording(MainActivity.java:70)
04-13 15:07:56.628: W/System.err(2542): at com.appulse.audiomate.MainActivity.buttonTapped(MainActivity.java:46)
04-13 15:07:56.628: W/System.err(2542): at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:07:56.628: W/System.err(2542): at java.lang.reflect.Method.invoke(Method.java:515)
04-13 15:07:56.628: W/System.err(2542): at android.view.View$1.onClick(View.java:3818)
04-13 15:07:56.628: W/System.err(2542): at android.view.View.performClick(View.java:4438)
04-13 15:07:56.628: W/System.err(2542): at android.view.View$PerformClick.run(View.java:18422)
04-13 15:07:56.628: W/System.err(2542): at android.os.Handler.handleCallback(Handler.java:733)
04-13 15:07:56.628: W/System.err(2542): at android.os.Handler.dispatchMessage(Handler.java:95)
04-13 15:07:56.628: W/System.err(2542): at android.os.Looper.loop(Looper.java:136)
04-13 15:07:56.628: W/System.err(2542): at android.app.ActivityThread.main(ActivityThread.java:5017)
04-13 15:07:56.628: W/System.err(2542): at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:07:56.628: W/System.err(2542): at java.lang.reflect.Method.invoke(Method.java:515)
04-13 15:07:56.628: W/System.err(2542): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-13 15:07:56.628: W/System.err(2542): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-13 15:07:56.628: W/System.err(2542): at dalvik.system.NativeStart.main(Native Method)
04-13 15:07:56.628: E/MediaPlayer(2542): stop called in state 0
04-13 15:07:56.628: E/MediaPlayer(2542): error (-38, 0)
04-13 15:07:56.628: E/MediaPlayer(2542): Error (-38,0)
You have missed out couple of things here, add break statement after each case in the function buttonTapped,
public void buttonTapped (View view){
switch(view.getId()){
case R.id.btn_start_recording:
try{
beginRecording();
} catch (Exception e){
e.printStackTrace();
}
break;
case R.id.btn_stop_recording:
try{
stopRecording();
} catch (Exception e){
e.printStackTrace();
}
break;
case R.id.btn_play:
try{
playRecording();
} catch (Exception e){
e.printStackTrace();
}
break;
case R.id.btn_stop:
try{
stopPlayback();
} catch (Exception e){
e.printStackTrace();
}
break;
}
}
and in the manifest files add these permissions.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>