I try to organize background video recording in Android 4.0. But I can't do it because of these problems:
Dummy Surface does not work in MediaRecorder (error: invalid surface)
If you use Surface 1 x 1 px on Activity, Surface is destroyed on Activity pause (recording is stopped)
If you use Surface 1 x 1 px on WindowsManager, Surface is destroyed on Application pause (recording is stopped)
SurfaceTexture does not work in MediaRecorder.setPreviewDisplay(new Surface(SurfaceTexture))
Widget does not allow to handle Surface 1 x 1 px
Status Bar does not allow to handle Surface 1 x 1 px
Please, help me to find right way.
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.
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.
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" />
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..
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With