Search code examples
javaandroidvideorecording

How to use Timer to restart record video for every preset interval time?


Can someone tell me how can i use something like a timer to start a video recording interval process for a period of time (eg: 5mins) then restarts to record another set of 5min video until the user intervene to stop the process.. I'm kinna new in android/java so can someone help me along with this question?

public class ServiceRecording extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    public static Camera ServiceCamera;
    public static boolean recordingStatus;

    @Override
    public void onCreate() {
        super.onCreate();

        recordingStatus = false;
        ServiceCamera = CameraTest.MainCamera;
        surfaceView = CameraTest.surfaceView;
        surfaceHolder = CameraTest.surfaceHolder;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        if (recordingStatus == false)
            startRecording();

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        stopRecording();
        //camera.stopPreview();
        recordingStatus = false;
        //camera.release();
    }   

    private MediaRecorder mediaRecorder;

    private static int encodingStatus;
    private static String videoResolution;
    private static String fileFormat;

    private static boolean audioStatus;
    private static int timeInterval;

    private static final String TAG = "Exception";

    public boolean startRecording(){
        try {
                encodingStatus = Tab1Activity.encodingPref;
                videoResolution = Tab1Activity.videoResPref;
                fileFormat = Tab1Activity.fileFormatPref;

                audioStatus = Tab2Activity.audioPref; 
                timeInterval = Tab2Activity.timeIntervalPref; 

                Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show();
                try{
                    ServiceCamera.reconnect();
                    ServiceCamera.unlock();
                }
                catch(Exception e){

                }

                mediaRecorder = new MediaRecorder();

                mediaRecorder.setCamera(ServiceCamera);

                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//

                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

                mediaRecorder.setMaxDuration(timeInterval);

                    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

                    mediaRecorder.setVideoEncoder(encodingStatus);

                    //mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH_mm_ss");
                    Date date = new Date();
                    File dirlist = new File(Environment.getExternalStorageDirectory() + "/VideoList");

                    if(!(dirlist.exists()))
                        dirlist.mkdir();

                    File TempFile = new File(Environment.getExternalStorageDirectory() + "/VideoList", dateFormat.format(date) + fileFormat);
                    mediaRecorder.setOutputFile(TempFile.getPath());

                    String[] separatedRes = videoResolution.split("x");
                    separatedRes[0];
                    separatedRes[1];

                    mediaRecorder.setVideoSize(surfaceView.getWidth(),surfaceView.getHeight());

                    //mediaRecorder.setVideoFrameRate(videoFramesPerSecond);

                    mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

                    mediaRecorder.prepare();
                    mediaRecorder.start();  

                    recordingStatus = true;

                    return true;                        
        } 

        catch (IllegalStateException e) {
            Log.d(TAG,e.getMessage());
            e.printStackTrace();
            return false;
        } 
        catch (IOException e) {
            Log.d(TAG,e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    public void stopRecording() {
        Toast.makeText(getBaseContext(), "Recording Stopped", Toast.LENGTH_SHORT).show();   
        mediaRecorder.reset();
        mediaRecorder.release();

        recordingStatus = false;
    }
}

Solution

  • This will start and stop the recording every 5 minutes,

    final ServiceRecording recording = ....
    final AtomicBoolean started = new AtomicBoolean(false);
    ScheduledExecutorService executor = Executors.newScheduledExecutor(1);
    executor.scheduleAtFixedRate(new Runnable() {
        public void run() {
             //only stop if we have started
             if(started.get()) {
                recording.stop();                
             } else {
               started.set(true);
             }
             recording.start();
        }
    }, 5, 5, TimeUnit.MINUTES);