애플리케이션 백그라운드에서 동영상을 녹화하는 방법 : Android
을 (를) 사용하여 응용 프로그램의 배경에서 비디오를 녹화 할 수있는 응용 프로그램을 개발 중입니다 Service
.
문제 설명 :
내 응용 프로그램에서 녹음이 예약됩니다. 사용자가 오후 1 시부 터 오후 3 시까 지 비디오를 녹화하려면 작업을 예약하고 애플리케이션을 종료 할 수 있습니다. 애플리케이션은 오후 1 시부 터 오후 3 시까 지 자동으로 녹화를 시작합니다.
내가 아직 한 일 :
내 쿼리에 대해 검색했지만 솔루션을 얻지 못했습니다. 많은 기사에서 불가능하다고 말합니다. 그러나 Google Play 에는 애플리케이션의 백그라운드에서 비디오를 녹화 할 수 있는 일부 애플리케이션 (예 : MyCar Recorder )이 있습니다.
나는 가지고 기사 같은 있지만 작동하지 않는 약을.
이 기능을 구현하는 방법은 무엇입니까?
1- 다음과 같은 서비스를 시작하는 활동을 만들었습니다.
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-이제 다음과 같이 백그라운드에서 비디오를 녹화하는 서비스를 만들었습니다 .
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 카드에 video.mp4 파일이 생성됩니다. 더 많은 기능을 추가하기 위해 코드를 변경할 수 있지만 기본 기능은이 코드를 통해 달성됩니다 (예 : 백그라운드에서 비디오 녹화).
참고 : 버튼 클릭 활동을 통해 서비스를 시작했지만 broadcastreceiver 등과 같은 다른 방법으로도 시작할 수 있습니다.
도움이 되었기를 바랍니다 !! 건배.
예, 다음과 같이 배경 비디오를 녹화 할 수 있습니다.
먼저 서비스를 이용하여 동영상 앱을 만듭니다. 표시되지 않도록보기를 설정하지 마십시오. 당신이 서비스에서 그것을하고 있다면 그것은 더 낫습니다. 왜냐하면 ...
Second, you can use the AlarmManager for setting the alarm of particular time and then at that time, by using intent, start your service again. For stopping your app you can use AlarmManager, as well.
'developer tip' 카테고리의 다른 글
Apple clang 버전 및 해당 업스트림 LLVM 버전 가져 오기 (0) | 2020.12.09 |
---|---|
jQuery 플러그인 템플릿-모범 사례, 규칙, 성능 및 메모리 영향 (0) | 2020.12.09 |
C ++ 11 람다에서 참조로 참조 캡처 (0) | 2020.12.09 |
Chrome 개발자 도구에서 디버깅하는 동안 줄 건너 뛰기 (0) | 2020.12.09 |
GMail Chat은 클라이언트 상호 작용없이 어떻게 AJAX 요청을 할 수 있습니까? (0) | 2020.12.09 |