1

我正在開發一個Android應用程序以便在Android developer guide的幫助下錄製視頻。我的程序中的所有代碼都與此頁面相同。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" /> 

當應用程序啓動時,相機預覽正在工作。但是當我按下RECEED按鈕時,給出了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 line is mCamera.unlock();

您能否讓我知道,這可能是什麼原因(在Samsung Galaxy 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; 
    } 

這是我的表面是如何創建的。

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爲空,您用來獲取相機的代碼是什麼? – L7ColWinters 2012-01-27 15:35:15

+0

謝謝。我已經添加了我的代碼。 – Chinthaka 2012-01-27 15:53:10

+0

你有沒有從你的日誌中發現runtimeException? – L7ColWinters 2012-01-27 16:00:34

回答

1

嘗試調用prepareVideoRecorder()之前釋放mCamera例如

即在surfaceCreated您使用mCamera所以我假設你在什麼地方創建相機的一個實例。然後,您在prepareVideoRecorder()中創建Camera的第二個實例 - 該方法的第一行是mCamera = getCameraInstance();

我相信這是你的問題的原因。您必須避免創建更多的相機實例。

2

我知道這很晚,但它會幫助你。

mcamera.unlock();之前使用mCamera = Camera.open(0);並在設備上進行測試,而不是在仿真器上進行測試。