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é?
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é.
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.