Introducing XDA:DevCon – A Conference For Developers By Developers
XDA Developers Android and Mobile Development Forum
Forgot your password?
 
Post Reply+
Tip us?
 
imso
Old
#1  
Member - OP
Thanks Meter 0
Posts: 57
Join Date: Mar 2011
Default [Q] 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..

Code:
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;
    }
}
 
imso
Old
#2  
Member - OP
Thanks Meter 0
Posts: 57
Join Date: Mar 2011
someone please help...
 
dedeep
Old
#3  
Member
Thanks Meter 8
Posts: 41
Join Date: Nov 2009
Default Thread

you are writing a service, right? typically this service should also implement a thread. inside this thread you could implement your timer feature.

-didi
 
imso
Old
#4  
Member - OP
Thanks Meter 0
Posts: 57
Join Date: Mar 2011
But the thing is i don't know how to even implement or even write the timer codes into my serviceRecording.java file... Can you help me on this?
 
killersnowman
Old
#5  
Senior Member
Thanks Meter 50
Posts: 327
Join Date: Mar 2011
Location: SLO
i recently did this with a widget. i used an AlarmManager to set repeating alarms that would broadcast an intent that could be caught by a broadcastReciever and then do something... im at work now but when i get home i can try to give you some sample code.
 
killersnowman
Old
#6  
Senior Member
Thanks Meter 50
Posts: 327
Join Date: Mar 2011
Location: SLO
you sure this needs to be a service? a service is something that is doing work but not at the forefront of the ui. its unseen. do you want your recording to be done in the background? i only ask because i did some research on services and found that they cannot be a BroadCastReciever and thus cannot use the AlarmManager that i said would work.

as far as a timer i have not looked into that particular class...

sorry i was no help. but if you decide to use the AlarmManager i could help
 
imso
Old
#7  
Member - OP
Thanks Meter 0
Posts: 57
Join Date: Mar 2011
Someone recently recommended using these code to implement the sort of interval recording i wanted with this code below but i don't seems to know how to implement these codes into my current code could someone lend me a hand how how can can i implement the appropriate codes into my code to make my code work? Or is there simpler way to achieve "dynamic" (with Preferences) interval recording?

Code:
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);
My serviceRecording
Code:
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();
    		//new Timer().scheduleAtFixedRate(task, after, interval);
    	}
    

    	return START_STICKY;
    }
    
    @Override
    public void onDestroy() {
    	super.onDestroy();
    
    	stopRecording();
    	//camera.stopPreview();
    	recordingStatus = false;
    	//camera.release();
    }	
    
	private MediaRecorder mediaRecorder;
	
    private static int encodingType;
    private static String videoResolution;
    private static String fileFormat;
    
    private static boolean audioStatus;
    private static int timeInterval;
  //timeInterval = Integer.parseInt(Tab2Activity.timeIntervalPref); 
    private static final String TAG = "Exception";
    
    public boolean startRecording(){
    	try {    		
    		SharedPreferences prefs_tab1 = getSharedPreferences("tab1", Context.MODE_PRIVATE);
    		SharedPreferences prefs_tab2 = getSharedPreferences("tab2", Context.MODE_PRIVATE);
    		
    		encodingType = Integer.parseInt(prefs_tab1.getString("EncodingPref", "1"));
    		//******************************************************************************
    		
    		String stringRes = CameraTest.resParams;
			String[] entriesValues = stringRes.split(",");
			String rawResolution = entriesValues[0];
			
			videoResolution = prefs_tab1.getString("ResolutionPref", rawResolution);
    		//******************************************************************************

			fileFormat =  prefs_tab1.getString("FileFormatPref", ".mp4");
    		//******************************************************************************

			audioStatus = prefs_tab2.getBoolean("AudioPref", true); //false
    		//******************************************************************************

    			Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show();
    			
    			try{
    				ServiceCamera.reconnect();
    				ServiceCamera.unlock();
    			}
    			catch(Exception e){
    				    					
    			}
    			
    			mediaRecorder = new MediaRecorder();
    			
    			mediaRecorder.setCamera(ServiceCamera);
    			
    			if(!audioStatus)
    			{
    				mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    			}
    
    			mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    
    			mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    			
    			if(!audioStatus)
    			{
    				mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    			}
    				
    				mediaRecorder.setVideoEncoder(encodingType);
    				
    				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");
    				mediaRecorder.setVideoSize(Integer.parseInt(separatedRes[0]),Integer.parseInt(separatedRes[1]));
    				
    				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;
    }
 
killersnowman
Old
#8  
Senior Member
Thanks Meter 50
Posts: 327
Join Date: Mar 2011
Location: SLO
Any progress on this? I was thinking you coukd have a private inner class in your service class that handles the timing with an AlarmManager

Im on my phone right now but something along these lines...

Private Class MyTimer extends BroadcastReciever {

//Implement onRecieve
Public void onRecieve(Context c, Intent i) {

//if intent matches 5min alarm
//start recording

}


Then in your service you can make a recurring alarm using the AlarmManager class to signal your inner class to start or even stop the recording based on what intent you pass it

When i get home ill right a bit more code as an example


From something awesome
 
killersnowman
Old
(Last edited by killersnowman; 3rd May 2011 at 06:03 PM.)
#9  
Senior Member
Thanks Meter 50
Posts: 327
Join Date: Mar 2011
Location: SLO
i wrote a bit of code. its incomplete. and you will have to maybe mess with making the AlarmServicer class either static, public, private or something to make it work. basicly your service creates a five minute alarm directed at the AlarmServicer that it catches in the onRecieve() method and then starts your recording again and then creates another alarm directed at itself. you can use some if/then logic to change wether or not the alarm will be created again based on if the user wants it to stop or not. and then to get it going again the service would invoke the setOneTimeAlarm method again.

Code:
public class ServiceRecording extends Service {

	// NEW CONSTANT
	public static final String FIVE_MIN_ALARM = "FIVE_MIN_ALARM";
	public static final int FIVE_MINUTES = 300;


	@Override
    	public void onCreate() {
    		super.onCreate();
    	
    		recordingStatus = false;
    		ServiceCamera = CameraTest.MainCamera;
    		surfaceView = CameraTest.surfaceView;
    		surfaceHolder = CameraTest.surfaceHolder;
		//set the first alarm
		AlarmServicer.setOneTimeAlarm(AlarmServicer.class, this, ServiceRecording.FIVE_MINUTES , ServiceRecording.FIVE_MIN_ALARM);
   	 }

	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) { }

	public boolean startRecording() {}

	public void stopRecording() {}


	// NEW CODE

	private static class AlarmServicer extends BroadcastReciever {

		@Override
    		public void onReceive(Context context, Intent intent) {
			super.onReceive(context, intent);
        			if (intent.getAction().equals(ServiceRecording.FIVE_MIN_ALARM)) {
            				ServiceRecording.startRecording();
				//set another five min alarm
				setOneTimeAlarm(AlarmServicer.class, this, ServiceRecording.FIVE_MINUTES, ServiceRecording.FIVE_MIN_ALARM;
       			 }
		}


		private static void setOneTimeAlarm(java.lang.Class<?> cls, Context context, int seconds, String action) {
        			AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        			Intent intent = new Intent(context, cls);
       			 intent.setAction(action);
        			PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        			am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (seconds * 1000), pendingIntent);
   		 }
	}

}

and i believe that you need to register the inner class as a broadcastreciever in the android manifest.

**
** this most likely wont work....
**

 
Post Reply+
Tags
android, camera, timer, video recording
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Go to top of page...

XDA PORTAL POSTS

Guide to Using Adobe Air on Android

When writing an app with performance in mind, you most likely want to write it native code using the … more

Boot Animation Paradise for your Android Device

The default boot animations on any device, no matter whichmanufacturer, are generally pretty … more