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 子句中,但没有解释在引发异常时该怎么做。
这是我的问题:
- 有什么方法可以查看是否有任何其他 Android 进程/服务锁定了 Glass 的摄像头?
- 如果是这样,我如何告诉该进程/服务给我摄像头?
- 也许在我链接的 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>
我把权限放在了错误的地方,这就是为什么我不断收到同样的错误!希望这对你也有帮助。
我已按照 Glass 指南拍照,找到 here。但是,这会创建一个新的 Intent,该 Intent 会自动捕获图片,而无需在 Glass 视口中创建相机预览。
为了让用户首先预览相机在玻璃视口上看到的内容,我遵循了 android 开发人员指南,找到了 here,最终 运行尝试调用 Camera.open()
:
java.lang.RuntimeException: Fail to connect to camera service
开发人员指南将 Camera.open()
包装在一个 try-catch 子句中,但没有解释在引发异常时该怎么做。
这是我的问题:
- 有什么方法可以查看是否有任何其他 Android 进程/服务锁定了 Glass 的摄像头?
- 如果是这样,我如何告诉该进程/服务给我摄像头?
- 也许在我链接的 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>
我把权限放在了错误的地方,这就是为什么我不断收到同样的错误!希望这对你也有帮助。