Google Glass:Camera.open() 总是导致运行时异常

Google Glass: Camera.open() always causes a runtime exception

我已按照 Glass 指南拍照,找到 here。但是,这会创建一个新的 Intent,该 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 开发者指南中,有没有办法让用户在拍照前预览图像?

感谢您的帮助!

请看下面的代码片段,它显示了在 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.

希望这会有所帮助!!

想通了。在我的 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">

在您的清单文件中将权限置于应用程序标签上方

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

我把权限放在了错误的地方,这就是为什么我不断收到同样的错误!希望这对你也有帮助。