【问题标题】:Google Glass: Camera.open() always causes a runtime exceptionGoogle Glass:Camera.open() 总是导致运行时异常
【发布时间】:2015-07-21 00:09:13
【问题描述】:

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

为了让用户首先预览相机在玻璃视口上看到的内容,我遵循了 android 开发者指南,找到了 here,最终在尝试调用 @987654324 时遇到了运行时异常@:

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

开发人员指南将 Camera.open() 包装在 try-catch 子句中,但没有说明在引发异常时该怎么做。

这是我的问题:

  1. 有什么方法可以查看其他 Android 进程/服务是否锁定了 Glass 的摄像头?
  2. 如果是这样,我如何告诉该进程/服务给我相机?
  3. 也许在我链接的 Glass 开发者指南中,有没有办法让用户在拍照前预览图像?

感谢您的帮助!

【问题讨论】:

  • Thanks for any help! 不是try-catch 挡住了你检测能不能打开相机的路吗?如果打不开,就得被别的进程锁住了,那么catch就被“调用”了……
  • 我明白这一点。我不明白当异常被捕获时该怎么做。开发人员指南只是打印堆栈跟踪。我如何告诉其他进程让我控制相机?如何判断其他进程控制了相机?
  • 我认为(!)-我不确定-,但您无权强制其他应用程序释放相机。但是例如,您可以告诉用户问题出在哪里以及他应该做什么。启动时,请查看this,它显示了如何检查另一个应用程序是否锁定了相机的模式。希望它有所帮助;)
  • 它自动拍照对我来说听起来很合乎逻辑,我现在对谷歌眼镜很熟悉,但是相机“看”的方向不是你的眼睛,更多的是你的眼睛吗?头呢?那么为什么要提供预览。它会根据您所看到的进行拍照。只是一个建议。

标签: android google-glass


【解决方案1】:

在您的清单文件中的应用程序标记上方放置权限

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

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

【讨论】:

    【解决方案2】:

    请看下面的sn-p代码,它显示在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

    希望这会有所帮助!

    【讨论】:

    • 根据OP,调用Camera.open会引发异常。你的代码会崩溃。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多