Cómo grabar video desde el fondo de la aplicación: Android

Estoy desarrollando una aplicación que podrá grabar video desde el fondo de la aplicación usando el Service .

Descripción del problema :

En mi aplicación, la grabación estará progtwigda. Si el usuario desea grabar un video de 1 PM a 3 PM, progtwigrá la tarea y puede salir de la aplicación. La aplicación comenzará a grabar automáticamente a la 1 p.m. a 3 p.m.

Lo que hice aún:

Busqué en Google mi consulta pero no obtuve una solución. Muchos artículos dicen que no es posible. Pero en Google Play hay algunas aplicaciones (por ejemplo, MyCar Recorder ) que pueden grabar video desde el fondo de la aplicación.

Obtuve un artículo sobre el mismo pero no funciona.

¿Cuál es la forma de implementar esta funcionalidad?

    1- He creado una actividad para comenzar un servicio como este:

     package com.android.camerarecorder; import android.app.Activity; import android.content.Intent; import android.hardware.Camera; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; public class CameraRecorder extends Activity implements SurfaceHolder.Callback { private static final String TAG = "Recorder"; public static SurfaceView mSurfaceView; public static SurfaceHolder mSurfaceHolder; public static Camera mCamera ; public static boolean mPreviewRunning; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView1); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); Button btnStart = (Button) findViewById(R.id.StartService); btnStart.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(CameraRecorder.this, RecorderService.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startService(intent); finish(); } }); Button btnStop = (Button) findViewById(R.id.StopService); btnStop.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { stopService(new Intent(CameraRecorder.this, RecorderService.class)); } }); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } } 

    2 – Ahora he creado un servicio para grabar el video en un fondo como este:

      package com.android.camerarecorder; import java.io.IOException; import java.util.List; import android.app.Service; import android.content.Intent; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.Size; import android.media.MediaRecorder; import android.os.IBinder; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.Toast; public class RecorderService extends Service { private static final String TAG = "RecorderService"; private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private static Camera mServiceCamera; private boolean mRecordingStatus; private MediaRecorder mMediaRecorder; @Override public void onCreate() { mRecordingStatus = false; //mServiceCamera = CameraRecorder.mCamera; mServiceCamera = Camera.open(1); mSurfaceView = CameraRecorder.mSurfaceView; mSurfaceHolder = CameraRecorder.mSurfaceHolder; super.onCreate(); if (mRecordingStatus == false) startRecording(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onDestroy() { stopRecording(); mRecordingStatus = false; super.onDestroy(); } public boolean startRecording(){ try { Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show(); //mServiceCamera = Camera.open(); Camera.Parameters params = mServiceCamera.getParameters(); mServiceCamera.setParameters(params); Camera.Parameters p = mServiceCamera.getParameters(); final List listSize = p.getSupportedPreviewSizes(); Size mPreviewSize = listSize.get(2); Log.v(TAG, "use: width = " + mPreviewSize.width + " height = " + mPreviewSize.height); p.setPreviewSize(mPreviewSize.width, mPreviewSize.height); p.setPreviewFormat(PixelFormat.YCbCr_420_SP); mServiceCamera.setParameters(p); try { mServiceCamera.setPreviewDisplay(mSurfaceHolder); mServiceCamera.startPreview(); } catch (IOException e) { Log.e(TAG, e.getMessage()); e.printStackTrace(); } mServiceCamera.unlock(); mMediaRecorder = new MediaRecorder(); mMediaRecorder.setCamera(mServiceCamera); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); mMediaRecorder.setOutputFile("/sdcard/video.mp4"); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); mMediaRecorder.prepare(); mMediaRecorder.start(); mRecordingStatus = 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(); try { mServiceCamera.reconnect(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mMediaRecorder.stop(); mMediaRecorder.reset(); mServiceCamera.stopPreview(); mMediaRecorder.release(); mServiceCamera.release(); mServiceCamera = null; } } 

    Creará un archivo video.mp4 en su tarjeta sd. Puede cambiar el código para agregar más funcionalidad, pero la funcionalidad básica se logra a través de este código, es decir, grabar video en segundo plano.

    NOTA: he comenzado el servicio a través del botón de clic en actividad, pero puede iniciarlo de cualquier otra manera, como receptor de radiodifusión, etc.

    ¡¡Espero eso ayude!! Aclamaciones.

    Sí, puedes grabar el video de fondo de esta manera:

    Primero, crea una aplicación de video usando el servicio. No configure su vista para que no sea visible. Si lo haces en servicio, entonces es mejor porque …

    En segundo lugar, puede usar el AlarmManager para configurar la alarma de una hora determinada y luego, en ese momento, usando intención, comience nuevamente su servicio. Para detener su aplicación también puede usar AlarmManager.