Android 摄像机:NullPointerException

发布于 2024-12-29 11:31:38 字数 3599 浏览 5 评论 0原文

我正在开发一个 Android 应用程序来在 Android 开发人员指南。我的程序上的所有代码都与此页面相同。

我已将权限定义为 标记之外的权限。

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

您能否告诉我,这可能是什么原因(在 Samsung 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());
       }
}

I am developing an Android app to record videos with the help of Android developer guide. All the code on my programme is same as this page.

I have defined permission as this outside of the <application> tag.

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

When application starts the camera preview is working. But when I press recorde button, the NullPointerException is given. Exception:

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

Can you please let me know, what can be the reason for this (tested on Samsung galaxy s2 and Nexus s)? Thanks

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

This is how my surface is created.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一个人的夜不怕黑 2025-01-05 11:31:39

我知道已经晚了,但它会对你有所帮助。

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

I know it's late, but it will help you.

Use mCamera = Camera.open(0); before mcamera.unlock(); and test it on a device, not on emulator.

巨坚强 2025-01-05 11:31:39

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

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

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

Try to releasing mCamera instance before call prepareVideoRecorder()

i.e. in surfaceCreated you use mCamera so I assume that you created an instance of Camera somewhere before. Then you are creating the second instance of Camera in prepareVideoRecorder() - the first line of that method is mCamera = getCameraInstance();

I believe that this is a cause of your problem. You must avoid creating more that one instance of Camera.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文