it-swarm.com.de

So zeichnen Sie Videos vom Hintergrund der Anwendung auf: Android

Ich entwickle eine Anwendung, mit der ich Videos vom Hintergrund der Anwendung mit Service aufnehmen kann.

Problembeschreibung:

In meiner Bewerbung wird die Aufnahme eingeplant. Wenn der Benutzer ein Video von 1 PM bis 3 PM) aufnehmen möchte, plant er die Aufgabe und kann die Anwendung beenden. Die Anwendung startet die Aufnahme automatisch um 13:00 bis 15:00 Uhr.

Was ich bisher getan habe:

Ich habe meine Anfrage gegoogelt, aber keine Lösung gefunden. Viele Artikel sagen, dass es nicht möglich ist. Aber in Google Play gibt es einige Anwendungen (zB MyCar Recorder ), die Videos vom Hintergrund der Anwendung aufnehmen können.

Ich habe ein Artikel über das gleiche, aber es funktioniert nicht.

Wie kann diese Funktionalität implementiert werden?

58
Android Learner

1- Ich habe eine Aktivität erstellt, um den Dienst wie folgt zu starten:

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 - Jetzt habe ich einen Dienst zum Aufzeichnen des Videos im Hintergrund wie folgt erstellt:

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

Es wird eine Datei video.mp4 auf Ihrer SD-Karte erstellt. Sie können den Code ändern, um weitere Funktionen hinzuzufügen, aber die Grundfunktionen werden durch diesen Code erreicht, d. h. Video im Hintergrund aufnehmen.

HINWEIS: Ich habe den Dienst durch Klicken auf eine Schaltfläche in der Aktivität gestartet, aber Sie können ihn auch auf eine andere Art und Weise wie z. B. Rundfunkempfänger usw. starten.

Ich hoffe es hilft!! Prost.

50

Ja, Sie können das Hintergrundvideo folgendermaßen aufnehmen:

Erstellen Sie zunächst eine Video-App mit dem Dienst. Stellen Sie die Ansicht nicht so ein, dass sie nicht sichtbar ist. Wenn Sie es im Dienst tun, dann ist das besser, weil ...

Zweitens können Sie den AlarmManager zum Einstellen des Alarms für eine bestimmte Zeit verwenden und dann zu diesem Zeitpunkt mit Absicht Ihren Dienst erneut starten. Zum Stoppen Ihrer App können Sie auch den AlarmManager verwenden.

4
Rahul