【问题标题】:Android Video Camera : NullPointerExceptionAndroid 摄像机:NullPointerException
【发布时间】:2012-01-27 15:31:27
【问题描述】:

我正在开发一个 Android 应用来在Android developer guide 的帮助下录制视频。我的程序上的所有代码都和这个页面一样。

我在<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" /> 

当应用程序启动时,相机预览正在工作。但是当我按下记录按钮时,会给出 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();

请告诉我,这可能是什么原因(在三星 Galaxy s2 和 Nexus s 上测试)?谢谢

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());
       }
}

【问题讨论】:

  • 所以 MCamera 为空,你拿相机的代码是什么?
  • 谢谢。我已经添加了我的代码。
  • 您是否因此在日志中捕获了 runtimeException?
  • 还有重要提示:将完全初始化的 SurfaceHolder 传递给 setPreviewDisplay(SurfaceHolder)。没有表面,相机将无法开始预览。重要提示:调用 startPreview() 开始更新预览图面。必须先开始预览,然后才能拍照。
  • 除了我提到的以外,我没有遇到任何其他异常。我也完全按照你说的做。

标签: android android-camera video-recording android-mediarecorder


【解决方案1】:

我知道现在很晚,但它会帮助你。

在mcamera.unlock(); 之前使用mCamera = Camera.open(0); 并在设备上测试它,而不是在模拟器上。

【讨论】:

    【解决方案2】:

    在调用prepareVideoRecorder()之前尝试释放mCamera实例

    即在 surfaceCreated 中,您使用 mCamera,因此我假设您之前在某处创建了 Camera 实例。然后在 prepareVideoRecorder() 中创建 Camera 的第二个实例 - 该方法的第一行是 mCamera = getCameraInstance();

    我相信这是您的问题的原因。您必须避免创建多个 Camera 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多