Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Background video recording in Android 4.0

Tags:

I try to organize background video recording in Android 4.0. But I can't do it because of these problems:

  1. Dummy Surface does not work in MediaRecorder (error: invalid surface)

  2. If you use Surface 1 x 1 px on Activity, Surface is destroyed on Activity pause (recording is stopped)

  3. If you use Surface 1 x 1 px on WindowsManager, Surface is destroyed on Application pause (recording is stopped)

  4. SurfaceTexture does not work in MediaRecorder.setPreviewDisplay(new Surface(SurfaceTexture))

  5. Widget does not allow to handle Surface 1 x 1 px

  6. Status Bar does not allow to handle Surface 1 x 1 px

Please, help me to find right way.

like image 414
shamanpenza Avatar asked Feb 24 '13 05:02

shamanpenza


People also ask

Can I record video in background android?

Open the Google Play Store app and search for the Record Video Background app. Install the app and open it. Provide the necessary access privileges to the app. Tap on the Record button in the center to start recording the video in the background even if the screen is turned off.

Can I record video with screen off?

Quick Video Recorder is a free Android app that not only allows you to record a video with the screen off, but you can also schedule a recording. To schedule a recording, tap on the clock tab and fill in the apps' information. For example, you'll need to fill in the: Date.


2 Answers

Sample and simple code (tested on Jelly Bean, SGS2):

public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback {      private WindowManager windowManager;     private SurfaceView surfaceView;     private Camera camera = null;     private MediaRecorder mediaRecorder = null;      @Override     public void onCreate() {          // Start foreground service to avoid unexpected kill         Notification notification = new Notification.Builder(this)             .setContentTitle("Background Video Recorder")             .setContentText("")             .setSmallIcon(R.drawable.ic_launcher)             .build();         startForeground(1234, notification);          // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback         windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);         surfaceView = new SurfaceView(this);         LayoutParams layoutParams = new WindowManager.LayoutParams(             1, 1,             WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,             WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,             PixelFormat.TRANSLUCENT         );         layoutParams.gravity = Gravity.LEFT | Gravity.TOP;         windowManager.addView(surfaceView, layoutParams);         surfaceView.getHolder().addCallback(this);      }      // Method called right after Surface created (initializing and starting MediaRecorder)     @Override     public void surfaceCreated(SurfaceHolder surfaceHolder) {          camera = Camera.open();         mediaRecorder = new MediaRecorder();         camera.unlock();          mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());         mediaRecorder.setCamera(camera);         mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);         mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);         mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));          mediaRecorder.setOutputFile(                 Environment.getExternalStorageDirectory()+"/"+                 DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime())+                 ".mp4"         );          try { mediaRecorder.prepare(); } catch (Exception e) {}         mediaRecorder.start();      }      // Stop recording and remove SurfaceView     @Override     public void onDestroy() {          mediaRecorder.stop();         mediaRecorder.reset();         mediaRecorder.release();          camera.lock();         camera.release();          windowManager.removeView(surfaceView);      }      @Override     public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {}      @Override     public void surfaceDestroyed(SurfaceHolder surfaceHolder) {}      @Override     public IBinder onBind(Intent intent) { return null; }  } 

Don't forget about permissions:

<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
like image 144
cman Avatar answered Dec 19 '22 10:12

cman


try {          mediaRecorder.prepare();      } catch (Exception e) {}     mediaRecorder.start();     Timer t = new Timer();     t.schedule(new TimerTask() {         @Override         public void run() {             stopSelf();         }     }, 5000); }catch(Exception e){} 

Just a small modification to the above code...it will save the 5sec file to the root folder in ur sdcard...modify the timer according to ur need. and it worked on Nexus 4 and Micromax as well..

like image 26
Mrudul Parikh Avatar answered Dec 19 '22 09:12

Mrudul Parikh