如何从应用程序的背景录制video:Android

我正在开发一个应用程序,将能够使用Service从应用程序的背景录制video。

问题描述 :

在我的应用程序录制将被安排。 如果用户想要从下午1点到下午3点录制video,他将安排任务并可以退出应用程序。 应用程序将自动在1PM至3PM开始录制。

我还做了什么:

我GOOGLE了我的查询,但没有得到解决办法。 许多文章说这是不可能的。 但在谷歌播放有一些应用程序(例如MyCar录音机 ),它可以logging从应用程序的背景video。

我收到了一篇关于它的文章 ,但没有成功。

什么是实现这个function的方式?

1-我已经创build了一个活动来启动这样的服务:

 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 – 现在我已经创build了一个服务来logging这样的背景video

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

它会在您的SD卡中创build一个文件video.mp4。 您可以更改添加更多function的代码,但基本function是通过此代码实现的,即在后台录制video。

注意:我已经通过button点击活动启动了服务,但您也可以通过其他方式启动它,例如广播接收器等。

希望能帮助到你!! 干杯。

是的,你可以像这样logging背景video:

首先,使用服务创build一个video应用程序。 不要将其视图设置为不可见。 如果你正在服务,那么这是更好的,因为…

其次,您可以使用AlarmManager设置特定时间的闹钟,然后在当时通过使用意图再次启动您的服务。 为了停止你的应用程序,你也可以使用AlarmManager。