Comment enregistrer une vidéo à partir de l’arrière-plan de l’application: Android

Je suis en train de développer une application qui pourra enregistrer des vidéos en arrière-plan d’application en utilisant Service .

Description du problème :

Dans mon application, l’enregistrement sera programmé. Si l’utilisateur souhaite enregistrer des vidéos de 13 heures à 15 heures, il planifiera la tâche et pourra quitter l’application. L’application commencera automatiquement à enregistrer entre 13 heures et 15 heures.

Ce que j’ai fait encore:

J’ai cherché Google sur ma requête mais je n’ai pas trouvé de solution. De nombreux articles disent que ce n’est pas possible. Mais dans Google Play, il existe certaines applications (par exemple MyCar Recorder ) qui peuvent enregistrer des vidéos à partir d’arrière-plan de l’application.

J’ai eu un article à ce sujet mais ça ne marche pas.

Quelle est la manière de mettre en œuvre cette fonctionnalité?

1- J’ai créé une activité pour démarrer le service comme ceci:

 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 Ssortingng 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 – Maintenant, j’ai créé un service pour enregistrer la vidéo en arrière-plan comme ceci:

  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 Ssortingng 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; } } 

Il va créer un fichier video.mp4 dans votre carte SD. vous pouvez changer le code pour append plus de fonctionnalités, mais la fonctionnalité de base est obtenue grâce à ce code, par exemple enregistrer la vidéo en arrière-plan.

NOTE: J’ai lancé le service en cliquant sur un bouton dans l’activité, mais vous pouvez également le démarrer par n’importe quel autre moyen, comme le récepteur de diffusion, etc.

J’espère que cela aide!! À votre santé.

Oui, vous pouvez enregistrer la vidéo d’arrière-plan comme ceci:

Tout d’abord, créez une application vidéo en utilisant le service. Ne définissez pas sa vue de sorte qu’elle ne soit pas visible. Si vous le faites en service, c’est mieux parce que …

Deuxièmement, vous pouvez utiliser AlarmManager pour définir l’alarme à une heure donnée et à ce moment-là, en utilisant l’intention, redémarrez votre service. Pour arrêter votre application, vous pouvez également utiliser AlarmManager.