1

Android developer guide의 도움으로 비디오를 녹화하는 Android 앱을 개발 중입니다. 내 프로그램의 모든 코드는이 페이지와 동일합니다.Android 비디오 카메라 : NullPointerException

<application> 태그 외부에서이 권한을 정의했습니다.

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus"/>  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

응용 프로그램이 시작되면 카메라 미리보기가 작동합니다. 그러나 recorde 버튼을 누르면 NullPointerException이 발생합니다. 예외 :

E/VIDEO_RECORDER(4782): Camera creating error :Fail to connect to camera service 
D/AndroidRuntime(4782): Shutting down VM 
W/dalvikvm(4782): threadid=1: thread exiting with uncaught exception (group=0x4001e578) 
E/AndroidRuntime(4782): FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.timico.video.CameraActivity.prepareVideoRecorder(CameraActivity.java:115) 
at com.timico.video.CameraActivity.access$5(CameraActivity.java:110) 
at com.timico.video.CameraActivity$1.onClick(CameraActivity.java:69) 
at android.view.View.performClick(View.java:2538) 
at android.view.View$PerformClick.run(View.java:9152) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3691) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
at dalvik.system.NativeStart.main(Native Method) 

115 줄은 mCamera.unlock()입니다.

삼성 갤럭시 s2 및 Nexus에서 테스트 한 이유는 무엇입니까? 감사합니다.

public static Camera getCameraInstance(){ 
     Camera c = null; 
     try{ 
      c = Camera.open(); 
     } catch(Exception e){ 
      Log.e(TAG, "Camera creating error :" + e.getMessage()); 
     } 
     return c; 
    } 

    private boolean prepareVideoRecorder(){ 

     mCamera = getCameraInstance();  
     mCamera.unlock(); 

     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.setCamera(mCamera); 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 
     mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 
     mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 

     try { 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 
      releaseMediaRecorder(); 
      return false; 
     } catch (IOException e) { 
      Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage()); 
      releaseMediaRecorder(); 
      return false; 
     } 
     return true; 
    } 

이것이 내 표면이 만들어지는 방법입니다. 전화 prepareVideoRecorder() 전에 mCamera 인스턴스를 해제하는

public void surfaceCreated(SurfaceHolder holder) {    
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
       Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
     } 
} 
+0

MCamera가 null 인 경우 카메라를 가져 오는 데 사용한 코드는 무엇입니까? – L7ColWinters

+0

감사합니다. 내 코드를 추가했습니다. – Chinthaka

+0

이것으로부터 로그에 잡힌 runtimeException가 있습니까? – L7ColWinters

답변

1

시도

즉, 당신은 그래서 당신이 어딘가에 전에 카메라의 인스턴스를 생성한다고 가정 mCamera를 사용 surfaceCreated에서. 그런 다음 prepareVideoRecorder()에서 Camera의 두 번째 인스턴스를 만들고 있습니다.이 메서드의 첫 번째 줄은 mCamera = getCameraInstance()입니다.

나는 이것이 문제의 원인이라고 생각합니다. Camera 인스턴스를 하나 더 생성하지 않아야합니다.

2

나는 그것이 늦었다 고 알고 있지만 도움이 될 것입니다.

mcamera.unlock(); 전에 mCamera = Camera.open(0);을 사용하고 에뮬레이터가 아닌 장치에서 테스트하십시오.