web-dev-qa-db-fra.com

Comment enregistrer une vidéo depuis l'arrière-plan de l'application: Android

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

Description du problème:

Dans mon application, l'enregistrement sera programmé. Si l'utilisateur souhaite enregistrer une vidéo de 1 PM à 15 h, il planifiera la tâche et pourra quitter l'application. L'application commencera automatiquement l'enregistrement de 13 h à 15 h.

Ce que j'ai encore fait:

J'ai recherché ma requête sur Google, mais je n'ai pas trouvé de solution. De nombreux articles disent que ce n'est pas possible. Mais dans Google Play il y a quelques applications (par exemple MyCar Recorder ) qui peuvent enregistrer des vidéos depuis l'arrière-plan de l'application.

J'ai un article à peu près pareil mais ça ne marche pas.

Comment implémenter cette fonctionnalité?

58
Android Learner

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 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 - Maintenant, j'ai créé n 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 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<Size> 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 créera un fichier video.mp4 dans votre carte SD. vous pouvez modifier le code pour ajouter plus de fonctionnalités, mais la fonctionnalité de base est obtenue grâce à ce code, c'est-à-dire enregistrer la vidéo en arrière-plan.

REMARQUE: j'ai démarré le service via un clic sur le bouton dans l'activité, mais vous pouvez le démarrer par tout autre moyen, comme le diffuseur, etc.

J'espère que ça aide!! À votre santé.

50
shridutt kothari

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

Créez d'abord une application vidéo à l'aide du service. Ne définissez pas sa vue pour qu'elle ne soit pas visible. Si vous le faites en service, c'est mieux parce que ...

Deuxièmement, vous pouvez utiliser AlarmManager pour régler l'alarme à une heure particulière, puis à ce moment-là, en utilisant l'intention, redémarrez votre service. Pour arrêter votre application, vous pouvez également utiliser AlarmManager.

4
Rahul