65 votes

Comment enregistrer une vidéo en arrière-plan d'une application : Android

Je suis en train de développer une application qui sera capable d'enregistrer une vidéo à partir de l'arrière-plan de l'application en utilisant Service .

Description du problème :

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

Ce que j'ai fait jusqu'à présent :

J'ai fait des recherches sur Internet à propos de ma question mais je n'ai pas trouvé de solution. De nombreux articles disent que ce n'est pas possible. Mais en Google Play il existe certaines applications (par exemple Enregistreur MyCar ) qui peut enregistrer des vidéos en arrière-plan de l'application.

J'ai eu un article à peu près la même chose mais ça ne marche pas.

Quelle est la façon de mettre en œuvre cette fonctionnalité ?

2 votes

J'aimerais aussi le savoir. Apparemment, c'est possible : play.google.fr/store/apps/

0 votes

Avez-vous essayé l'exemple de projet sur le site de l'article ? github.com/pickerweng/CameraRecorder

0 votes

Je n'ai pas encore essayé, mais il semble que l'utilisateur doive lancer l'application à chaque fois et qu'elle commence à enregistrer en arrière-plan. Est-ce que j'ai raison ? Je vais essayer ce code bientôt. Merci.

61voto

shridutt kothari Points 2038

1- J'ai créé une activité pour démarrer un service comme celui-ci :

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éé un service pour enregistrer la vidéo en arrière-plan comme ça :

    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 sur votre carte SD. Vous pouvez modifier le code pour ajouter d'autres fonctionnalités mais la fonctionnalité de base est réalisée par ce code, c'est-à-dire enregistrer une vidéo en arrière-plan.

NOTE : j'ai démarré le service en cliquant sur un bouton dans l'activité mais vous pouvez le démarrer de n'importe quelle autre manière, par exemple par le biais de broadcastreceiver, etc.

J'espère que ça aidera ! A la vôtre.

1 votes

Donc, il va continuer à écrire la vidéo lorsque je minimise l'application, n'est-ce pas ?

1 votes

Mais où est la magie ? Vous utilisez juste la caméra enregistreuse du service. Je pensais qu'il devait y avoir quelque chose de plus mystérieux. ;) Ouais, je vais donner +50 pour vous bientôt.

2 votes

Je voudrais jouer mon mediaplayer sur le service et mettre la vue de surface à l'arrière-plan est-ce possible et pouvez-vous me suggérer quelques exemples ?

4voto

Rahul Points 289

Oui, vous pouvez enregistrer la vidéo de fond comme ceci :

Tout d'abord, créez une application vidéo en utilisant le service. Ne définissez pas sa vue de manière à ce qu'elle ne soit pas visible. Si vous le faites en service, c'est mieux car...

Ensuite, vous pouvez utiliser l'AlarmManager pour définir une alarme à une heure précise, puis à ce moment-là, en utilisant l'intention, redémarrer votre service. Pour arrêter votre application, vous pouvez également utiliser AlarmManager.

1 votes

Cool... puis lancez votre application vidéo en utilisant le récepteur de diffusion. après avoir terminé cela, faites-moi savoir que je vous indiquerai l'étape suivante. :)

0 votes

Vous êtes familier avec le rite de l'émetteur-récepteur ?

0 votes

Pouvez-vous me dire comment créer une instance SurfaceView à partir d'un service ?

4voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X