[MainActivity]
public class MainActivity extends Activity implements OnClickListener {
private Camera myCamera;
private MyCameraSurfaceView myCameraSurfaceView;
private MediaRecorder mediaRecorder;
SurfaceHolder surfaceHolder;
boolean recording;
Calendar mcalendar;
int year, month, day;
int hour, minitues, second;
String name;
File mfile;
String dirPath, mPath;
LinearLayout myCameraPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recording = false;
setContentView(R.layout.activity_main);
myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
myCameraPreview = (LinearLayout) findViewById(R.id.videoview);
myCameraPreview.setOnClickListener(this);
myCameraPreview.addView(myCameraSurfaceView);
}
private Camera getCameraInstance() {
// TODO Auto-generated method stub
Camera c = null;
try {
c = Camera.open();
// attempt to get a Camera instance
} catch (Exception e) {
// Camera is not available (in use or does not exist)
}
return c;
}
private boolean prepareMediaRecorder() {
myCamera = getCameraInstance();
mediaRecorder = new MediaRecorder();
myCamera.unlock();
mediaRecorder.setCamera(myCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mediaRecorder.setOutputFile(dirPath+getDate());
mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface());
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
releaseMediaRecorder();
return false;
} catch (IOException e) {
releaseMediaRecorder();
return false;
}
return true;
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//myCamera = getCameraInstance();
//myCameraSurfaceView.resume();
}
private void releaseMediaRecorder() {
if (mediaRecorder != null) {
mediaRecorder.reset(); // clear recorder configuration
mediaRecorder.release(); // release the recorder object
mediaRecorder = null;
//myCamera.lock();
recording = false;
// lock camera for later use
}
}
private void releaseCamera() {
if (myCamera != null) {
myCamera.release();
// release the camera for other applications
myCamera = null;
}
}
}
[MyCameraSurfaceView]
public class MyCameraSurfaceView extends SurfaceView implements Callback{
private SurfaceHolder mHolder;
private Camera mCamera;
public MyCameraSurfaceView(Context context, Camera camera) {
super(context);
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// TODO Auto-generated constructor stub
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
try {
mCamera.stopPreview();
} catch (Exception e){
}
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (Exception e){
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
}
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
//mCamera.stopPreview();
//mCamera = null;
}
}
카메라로 녹화해서 동영상을 보는 앱을 만들고 있습니다.
그런데 녹화하고 동영상을 VideoView로 보고 다시 카메라로 돌아가면 오류가 납니다
로그켓에서는 surfaceCreated에서 카메라 프리뷰오류가 나는데 왜그런지 도저히 감이 오질 않습니다;;
고수님들 어떻게 해야지 다시 프리뷰 될까요?