전면 카메라로 녹화를 하려고 합니다.
후방 카메라는 잘 되어서 전면만 테스트 해보면 되는데
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getIntent() != null){
Intent intent = getIntent();
mCameraNumver = intent.getIntExtra("CAMERA_NUMBER", 1);
}
mPreview = new Preview(this);
mPreview.mCameraNumber = mCameraNumver;
LayoutInflater inflater = getLayoutInflater();
setContentView(mPreview);
View layout = (View)inflater.inflate(com.thelightsgift.BackheadMirror.R.layout.camera0, null);
disMetrics = getResources().getDisplayMetrics();
addContentView(layout, new LinearLayout.LayoutParams(disMetrics.widthPixels, disMetrics.heightPixels));
layout.bringToFront();
btnList = (Button)findViewById(R.id.btnList);
btnRec = (Button)findViewById(R.id.btnRec);
btnPlay = (Button)findViewById(R.id.btnPlay);
}
public void onClickSwitch(View v){
}
public void onClickRecoding(View v){
if (isRecording != sRecbutton_Rec) {
mPreview.releaseMediaRecorder();
BtnRecBackgroundImage(sRecButton, sRecbutton_Rec);
isRecording = sRecbutton_Stop;
} else {
mFilePath = mPreview.getOutputMediaFile().toString();
if (mPreview.prepareVideoRecorder(mFilePath)) {
mPreview.mRecorder.start();
BtnRecBackgroundImage(sRecButton, sRecbutton_Stop);
isRecording = sRecbutton_Rec;
RecordeStayTimer.schedule(mStopRecoding, mRecordTime);
} else {
mPreview.releaseCamera();
}
}
}
private void BtnRecBackgroundImage(int mButtonPosion, boolean mState){
if(mButtonPosion == sRecButton) {
if (mState == sRecbutton_Rec) {
btnRec.post(new Runnable() {
@Override
public void run() { btnRec.setBackgroundResource(R.drawable.record);
}
});
} else {
btnRec.post(new Runnable() {
@Override
public void run() {btnRec.setBackgroundResource(R.drawable.stop);
}
});
}
}else if(mButtonPosion == sPlayButton){
if(mState == sPlaybutton_Play){
btnPlay.post(new Runnable() {
@Override
public void run() { btnPlay.setBackgroundResource(R.drawable.play);
}
});
} else {
btnPlay.post(new Runnable() {
@Override
public void run() {btnPlay.setBackgroundResource(R.drawable.pause);
}
});
}
}
}
위 코드는 메인이고
class Preview extends SurfaceView implements SurfaceHolder.Callback,
MediaRecorder.OnInfoListener, MediaRecorder.OnErrorListener {
private static final String TAG = "RecordVideo";
private SurfaceHolder mHolder;
private Camera mCamera;
private Camera.Size mCameraSize;
private Camera.Parameters mParams;// = mCamera.getParameters();
private List<Camera.Size> list;// = params.getSupportedPreviewSizes();
private CameraSellSize cameraSellSize;
private int mDisplayWidth = 0;
private int mDisplayHeigth = 0;
private DisplayMetrics disMetrics;
private String mOutputFileName;
public MediaRecorder mRecorder = null;
public int mCameraNumber;
public SurfaceHolder getmHolder() {
return mHolder;
}
public Camera getmCamera() {
return mCamera;
}
public Camera.Parameters getmParams() {
return mParams;
}
Preview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
LogD("\nClass[Preview] Preview");
}
public boolean prepareVideoRecorder(String mFilePath){
if(mCamera==null) {
mCamera = getCameraInstance();
//Camera.Parameters params = mCamera.getParameters();
//params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
mRecorder = new MediaRecorder();
mCamera.unlock();
mRecorder.setCamera(mCamera);
mRecorder.setOrientationHint(90);
mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mRecorder.setOutputFile(mFilePath);//getOutputMediaFile().toString());
mRecorder.setPreviewDisplay(mHolder.getSurface());
try {
mRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing " + e.getMessage());
releaseCamera();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
releaseCamera();
return false;
}
return true;
}
public Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open(mCameraNumber);
Camera.Parameters params = c.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
params.set("camera-id",2);
c.setParameters(params);
}
catch (Exception e){
}
return c;
}
public void releaseCamera(){
if (mCamera != null) {
mCamera.release();
mCamera = null;
LogD("\nCamera released");
}
}
}
위 코드는 SurfaceView 입니다.
Caused by: java.lang.NullPointerException
at com.thelightsgift.BackheadMirror.Preview.prepareVideoRecorder(Preview.java:149)
at com.thelightsgift.BackheadMirror.CameraPreview.onClickRecoding(CameraPreview.java:213)
에러는 위와 같습니다. (해당 라인은 mPreview.mRecorder.start(); 입니다. 찾기 힘드실까봐...)
전면카메라를 사용하는데 어떤 걸 빼먹었는지 잘 모르겠습니다.
선배님들의 조언 부탁 드립니다.