secreto secret pro premium para mega grabador descargar android video background recording

secret - Grabación de video de fondo en Android 4.0



secret video recorder apk (3)

Encontré la respuesta: es necesario usar WindowManager y llamarlo desde el Servicio.

Intento organizar la grabación de video de fondo en Android 4.0. Pero no puedo hacerlo debido a estos problemas:

  1. Dummy Surface no funciona en MediaRecorder (error: superficie no válida)

  2. Si usa Surface 1 x 1 px en Activity, Surface se destruye en Activity Pause (se detiene la grabación)

  3. Si usa Surface 1 x 1 px en WindowsManager, Surface se destruye en la pausa de la aplicación (se detiene la grabación)

  4. SurfaceTexture no funciona en MediaRecorder.setPreviewDisplay (new Surface (SurfaceTexture))

  5. Widget no permite manejar Surface 1 x 1 px

  6. La barra de estado no permite manejar Surface 1 x 1 px

Por favor, ayúdame a encontrar la forma correcta.


Muestra y código simple (probado en 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; } }

No te olvides de los permisos:

<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){}

Solo una pequeña modificación al código anterior ... guardará el archivo de 5 segundos en la carpeta raíz en su tarjeta SD ... modifique el temporizador según su necesidad. y funcionó en Nexus 4 y Micromax también ..