Java 无法连接到摄像头服务

Java 无法连接到摄像头服务,java,android,Java,Android,我把相机设置为this.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向)可以正常工作,但如果我将其更改为纵向而不是横向,则它会崩溃,并出现以下错误 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): FATAL EXCEPTION: main 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): java.lang.RuntimeE

我把相机设置为
this.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向)
可以正常工作,但如果我将其更改为
纵向
而不是
横向
,则它会崩溃,并出现以下错误

07-30 12:51:37.655: ERROR/AndroidRuntime(22069): FATAL EXCEPTION: main
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): java.lang.RuntimeException: Fail to connect to camera service
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):     at android.hardware.Camera.native_setup(Native Method)
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):     at android.hardware.Camera.<init>(Camera.java:110)
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):     at android.hardware.Camera.open(Camera.java:90)
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):     at org.digital.com.CamLayer.surfaceCreated(CamLayer.java:3
它在
mCamera=Camera.open()时崩溃

我的清单文件有


如何解决此问题,以便在纵向视图中查看我的应用程序?

您在AndroidManifest.xml中有此设置吗

uses-permission android:name="android.permission.CAMERA"

我看到您已将预览区域设置为800 x 480。在纵向模式下,此大小无效,API中可能存在导致其崩溃的错误


尝试将预览区域设置为200x200,以供参考,这是我在应用程序中使用的SurfaceHolderCallBack内部类,在Nexus One 2.2的纵向模式下工作良好-希望有帮助

编辑:“哪个有效”=“哪个不崩溃”。尽管我还没有弄清楚如何正确旋转预览图像(请参见上面我的第一条评论)。这就是为什么我实际上必须使用横向,并将围绕预览表面的UI内容“转换”为横向模式。 Afaik预览(预览图像旋转正确)仅在横向模式下工作。我尝试的旋转和方向参数没有任何帮助

class SurfaceHolderCallback implements SurfaceHolder.Callback {
    private static final int IMAGE_WIDTH = 512;
    private static final int IMAGE_HEIGHT = 384;
    private static final String ORIENTATION = "orientation";
    private static final String ROTATION = "rotation";
    private static final String PORTRAIT = "portrait";
    private static final String LANDSCAPE = "landscape";

    public void surfaceCreated(SurfaceHolder holder) {
        try {
            // This case can actually happen if the user opens and closes the camera too frequently.
            // The problem is that we cannot really prevent this from happening as the user can easily
            // get into a chain of activites and tries to escape using the back button.
            // The most sensible solution would be to quit the entire EPostcard flow once the picture is sent.
            camera = Camera.open();
        } catch(Exception e) {
            finish();
            return;
        }

        //Surface.setOrientation(Display.DEFAULT_DISPLAY,Surface.ROTATION_90);
        Parameters p = camera.getParameters();
        p.setPictureSize(IMAGE_WIDTH, IMAGE_HEIGHT);

        camera.getParameters().setRotation(90);

        Camera.Size s = p.getSupportedPreviewSizes().get(0);
        p.setPreviewSize( s.width, s.height );

        p.setPictureFormat(PixelFormat.JPEG);
        p.set("flash-mode", "auto");
        camera.setParameters(p);

        try {
            camera.setPreviewDisplay(surfaceHolder);
        } catch (Throwable ignored) {
            Log.e(APP, "set preview error.", ignored);
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {
        if (isPreviewRunning) {
            camera.stopPreview();
        }
        try {
            camera.startPreview();
        } catch(Exception e) {
            Log.d(APP, "Cannot start preview", e);    
        }
        isPreviewRunning = true;
    }

    public void surfaceDestroyed(SurfaceHolder arg0) {
        if(isPreviewRunning && camera != null) {
            if(camera!=null) {
                camera.stopPreview();
                camera.release();  
                camera = null;
            }
            isPreviewRunning = false;
        }
    }
}

平台中存在一些并发问题:

解决方法是在释放cam之前清除回调,也就是说,我建议使用以下清理代码:

    @Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (mCam != null) {
        mCam.stopPreview();
        mCam.setPreviewCallback(null);
        mCam.release();
        mCam = null;
    }
}

我认为你的问题是,当你旋转相机时,它没有正确地释放,或者根本没有释放。如果从
横向
切换到
纵向
则再次启动意图。如果未释放并重新打开相机,则尝试打开已打开的相机,这会引发错误。

而不是使用:

<uses-permission
    android:name="android.permission.FLASHLIGHT"/>
<uses-permission
    android:name="android.permission.FLASHLIGHT"
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
    android:protectionLevel="normal" />
<uses-permission android:name="android.permission.CAMERA" />

尝试使用:

<uses-permission
    android:name="android.permission.FLASHLIGHT"/>
<uses-permission
    android:name="android.permission.FLASHLIGHT"
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
    android:protectionLevel="normal" />
<uses-permission android:name="android.permission.CAMERA" />

并且不要忘记添加照相机的权限:

<uses-permission
    android:name="android.permission.FLASHLIGHT"/>
<uses-permission
    android:name="android.permission.FLASHLIGHT"
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
    android:protectionLevel="normal" />
<uses-permission android:name="android.permission.CAMERA" />

如果您使用的是Android仿真器,另一种可能是前后摄像头在Android虚拟设备设置中被定义为“无”。

这可能有效

   @Override public void surfaceDestroyed(SurfaceHolder holder) {
    Log.d("surfaceDestroyed", "");
    cameraSource.stop();   //check if you have this line
  }

您使用的是什么设备?SDK的版本是什么?Afaik相机预览仅在横向模式下正常工作,但在纵向模式下正常工作。我还想在肖像模式下使用它(在N1上,在三星Galaxy S上),但没有成功。另请参阅位于的bug跟踪器;虽然我从来没有遇到过像你上面提到的错误。你有其他设备来测试它吗?它在Emulator中工作吗?如果它是一个小apk,我可以帮助你在我的N1和Galaxy s上测试它。你的2.2是最终的2.2 FRF91?我在同一条线上面临着同样的问题。异常并不总是发生,但它有时会发生。有人能解释为什么它有时会崩溃,有时不总是。。。。。?我使用的是三星gt-s5360Skizit,关于我在上面的代码示例中尝试了800x480 previewSize,在NexusOne2.2上运行正常,你能帮我一下吗。事实上,800x480是在调用:p.getSupportedPreviewSizes().get(0);-因此它是一个正确的预览大小。是的,这并不能解决任何问题。它打破了我的设置参数。你必须找到最佳的预览大小得到所有大小的比较,并得到最大的一个,它将工作,100rabh。。。你能帮我谢谢你发这个帖子吗,即使很明显,这对一些搜索这个的人(比如我)来说是一个有用的提示。。。关于Kangur,你能帮我一下吗。。。你能帮我一下吗对不起,我已经三年没做过雄激素了。。不知道它现在是怎么工作的:)马蒂亚斯·林。。。你能帮我解释一下你在哪里使用了finish方法(在catch块中)以及它的作用吗?它似乎在nexus7(Android 5.0)上对我有所帮助。额外的
级别
行的含义是什么?