Google Glass:Camera.open()始终会导致运行时异常

时间:2015-01-11 00:54:53

标签: android google-glass

我按照玻璃指南拍照,找到here。但是,这会创建一个新的Intent,可以自动捕获图片而无需在Glass视口中创建相机预览。

为了让用户首先预览相机在玻璃'视口上看到的内容,我按照Android开发人员指南找到了here,并最终遇到了尝试调用时抛出的运行时异常Camera.open()

java.lang.RuntimeException: Fail to connect to camera service

开发人员指南将Camera.open()包装在try-catch子句中,但没有解释在引发异常的情况下该怎么做。

以下是我的问题:

  1. 有没有办法看看其他任何Android进程/服务是否锁定了Glass的相机?
  2. 如果是这样,我怎么能告诉那个过程/服务给我相机?
  3. 也许在我链接的Glass开发者指南中,有没有办法让用户在拍照之前预览图像?
  4. 感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

将权限放在清单文件

中的Application标记之上
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus"/>

<application>
      <activity></activity>
</application> 

我将权限保留在错误的位置,这就是为什么我不断得到同样的错误!希望这对你也有帮助。

答案 1 :(得分:0)

请查看以下代码段,其中显示了在camera.open()中获取相机,然后在拍摄照片时释放。

public class CameraView extends SurfaceView implements SurfaceHolder.Callback
{
            private SurfaceHolder surfaceHolder = null;
            private Camera camera = null;

            @SuppressWarnings("deprecation")
            public CameraView(Context context)
            {
                super(context);
                surfaceHolder = this.getHolder();
                surfaceHolder.addCallback(this);
                surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder)
            {
                camera = Camera.open();

                // Set the Hotfix for Google Glass
                this.setCameraParameters(camera);

                // Show the Camera display
                try
                {
                                camera.setPreviewDisplay(holder);
                }
                catch (Exception e)
                {
                                this.releaseCamera();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
            {
                // Start the preview for surfaceChanged
                if (camera != null)
                {
                                camera.startPreview();
                }
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder)
            {
                // Do not hold the camera during surfaceDestroyed - view should be gone
                this.releaseCamera();
            }

            public void setCameraParameters(Camera camera)
            {
                if (camera != null)
                {
                                Parameters parameters = camera.getParameters();
                                parameters.setPreviewFpsRange(30000, 30000);
                                camera.setParameters(parameters);   
                }
            }

            public void releaseCamera()
            {
                if (camera != null)
                {
                                camera.release();
                                camera = null;
                }
            }
}

这是一个有效的代码。前面的详细信息请查看以下tutorial

希望这会有所帮助!!

答案 2 :(得分:0)

想出来。在我的AndroidManifest.xml中,我将权限和功能请求放在application下,而不是直接放在manifest下:

<强>之前:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my.organization">

        <application
            android:name=".MyApp"
            android:allowBackup="true"
            android:label="@string/app_name">

            <uses-permission android:name="android.permission.CAMERA" />
            <uses-feature android:name="android.hardware.Camera" />

<强>后:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my.organization">

        <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.Camera" />

        <application
            android:name=".MyApp"
            android:allowBackup="true"
            android:label="@string/app_name">