androidtimercountdownrecorder

Android countDownTimer only works once


I am new in android studio. I am trying to make a voice recorder app that can automatically record for 10 seconds once the record button is clicked. I did that using a countdown timer. However, the countdown timer only works for the first time. The recorder does not stop automatically when I try to record for the second time. I can't seem to find problem.

import android.media.MediaPlayer;
import android.media.MediaRecorder;

import android.os.CountDownTimer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.Random;

import static android.Manifest.permission.RECORD_AUDIO;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

import android.support.v4.app.ActivityCompat;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

Button buttonStart,  buttonPlayLastRecordAudio ;
String AudioSavePathInDevice = null;
MediaRecorder mediaRecorder ;
Random random ;
String RandomAudioFileName = "ABCDEFGHIJKLMNOP";
public static final int RequestPermissionCode = 1;
MediaPlayer mediaPlayer ;
CountDownTimer countDownTimer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buttonStart = (Button) findViewById(R.id.button);
    buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);

    buttonPlayLastRecordAudio.setEnabled(false);

    random = new Random();

    buttonStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (checkPermission()) {

                AudioSavePathInDevice =
                        Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
                                CreateRandomAudioFileName(5) + "AudioRecording.3gp";

                MediaRecorderReady();

                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                buttonStart.setEnabled(true);
                buttonPlayLastRecordAudio.setEnabled(true);

                Toast.makeText(MainActivity.this, "Recording started",
                        Toast.LENGTH_LONG).show();
            } else {
                requestPermission();
            }
        }
    });


    buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) throws IllegalArgumentException,
                        SecurityException, IllegalStateException {

            mediaPlayer = new MediaPlayer();
            try {
                mediaPlayer.setDataSource(AudioSavePathInDevice);
                mediaPlayer.prepare();
            } catch (IOException e) {
                        e.printStackTrace();
            }

            mediaPlayer.start();
            Toast.makeText(MainActivity.this, "Recording Playing",
                            Toast.LENGTH_LONG).show();

        }
    });

    CountDownTimer countDowntimer = new CountDownTimer(5000, 10000) {
        public void onTick(long millisUntilFinished) {
        }

        public void onFinish() {
            Toast.makeText(MainActivity.this, "Stop recording Automatically ", Toast.LENGTH_LONG).show();
            mediaRecorder.stop();
            buttonStart.setEnabled(true);

        }
    };countDowntimer.start();

}

public void MediaRecorderReady(){
    mediaRecorder=new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
    mediaRecorder.setOutputFile(AudioSavePathInDevice);
}

public String CreateRandomAudioFileName(int string){
    StringBuilder stringBuilder = new StringBuilder( string );
    int i = 0 ;
    while(i < string ) {
        stringBuilder.append(RandomAudioFileName.
                charAt(random.nextInt(RandomAudioFileName.length())));

        i++ ;
    }
    return stringBuilder.toString();
}

private void requestPermission() {
    ActivityCompat.requestPermissions(MainActivity.this, new
            String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case RequestPermissionCode:
            if (grantResults.length> 0) {
                boolean StoragePermission = grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED;
                boolean RecordPermission = grantResults[1] ==
                        PackageManager.PERMISSION_GRANTED;

                if (StoragePermission && RecordPermission) {
                    Toast.makeText(MainActivity.this, "Permission Granted",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(MainActivity.this,"Permission Denied",Toast.LENGTH_LONG).show();
                }
            }
            break;
    }
}

public boolean checkPermission() {
    int result = ContextCompat.checkSelfPermission(getApplicationContext(),
            WRITE_EXTERNAL_STORAGE);
    int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
            RECORD_AUDIO);
    return result == PackageManager.PERMISSION_GRANTED &&
            result1 == PackageManager.PERMISSION_GRANTED;
}
}

Solution

  • You are putting the countDowntimer in onCreate() method, you need to put it inside the onClick of buttonStart

    buttonStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
    
            if (checkPermission()) {
    
                AudioSavePathInDevice =
                            Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
                                    CreateRandomAudioFileName(5) + "AudioRecording.3gp";
    
                MediaRecorderReady();
    
                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
                buttonStart.setEnabled(true);
                buttonPlayLastRecordAudio.setEnabled(true);
    
                CountDownTimer countDowntimer = new CountDownTimer(5000, 10000) {
                    public void onTick(long millisUntilFinished) {
                    }
    
                    public void onFinish() {
                        Toast.makeText(MainActivity.this, "Stop recording Automatically ", Toast.LENGTH_LONG).show();
                        mediaRecorder.stop();
                        buttonStart.setEnabled(true);
    
                    }
                };
                countDowntimer.start();
    
                Toast.makeText(MainActivity.this, "Recording started",
                            Toast.LENGTH_LONG).show();
            } else {
                    requestPermission();
            }
        }
    });
    

    And ofcourse, remove your outside countDowntimer