마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

전면 카메라 질문 입니다.

0 추천

전면 카메라로 녹화를 하려고 합니다.

후방 카메라는 잘 되어서 전면만 테스트 해보면 되는데

    @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(); 입니다. 찾기 힘드실까봐...)

전면카메라를 사용하는데 어떤 걸 빼먹었는지 잘 모르겠습니다.

선배님들의 조언 부탁 드립니다.

빛의선물 (180 포인트) 님이 2015년 9월 14일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...