Android 安卓无表面照像机拍照

Android 安卓无表面照像机拍照,android,camera,android-camera,Android,Camera,Android Camera,在某些设备上尝试从服务(无GUI)拍照时,我会遇到运行时异常。但是,如果我使用SurfaceHolder从活动中拍摄照片,它将起作用 Camera.Parameters parameters = camera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG); camera.setParameters(parameters); SurfaceView mview = new SurfaceView(context); c

在某些设备上尝试从服务(无GUI)拍照时,我会遇到运行时异常。但是,如果我使用SurfaceHolder从活动中拍摄照片,它将起作用

Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
camera.setParameters(parameters);
SurfaceView mview = new SurfaceView(context);
camera.setPreviewDisplay(mview.getHolder());
camera.startPreview();
camera.takePicture(null,null,iccb);
这个序列在大多数设备上运行良好,但特别是在Motorola Droid上,调用takePicture方法(实际上是本机方法)将引发RuntimeException。还尝试了camera.setPreviewDisplay(null),但它也无法工作

然而,如果我在活动中使用real SurfaceView,它在Droid上也可以正常工作,但我需要在后台服务中使用它

您是否认为这种行为是出于隐私原因而显示的,因此没有人可以在不实际显示图像的情况下拍照?这对我来说没有什么意义,因为我可以加载一个0大小预览的虚拟活动,它可以工作,但我不想这样做

LogCat输出:

10-24 12:20:57.838 D/CameraHal(267): hardware/ti/omap4/omap3/camera-omap4/src/CameraHal.cpp:189 enableMsgType - Preview callback not enabled 1c2
10-24 12:20:57.838 E/CameraHal(267): hardware/ti/omap4/omap3/camera-omap4/src/CameraHal.cpp:2448 takePicture - takePicture called with image buffer 0x0
10-24 12:20:57.838 D/AndroidRuntime(29248): Shutting down VM
10-24 12:20:57.838 W/dalvikvm(29248): threadid=1: thread exiting with uncaught exception (group=0x4001e560)
10-24 12:20:57.846 E/AndroidRuntime(29248): FATAL EXCEPTION: main
10-24 12:20:57.846 E/AndroidRuntime(29248): java.lang.RuntimeException: takePicture failed
10-24 12:20:57.846 E/AndroidRuntime(29248): at android.hardware.Camera.native_takePicture(Native Method)
10-24 12:20:57.846 E/AndroidRuntime(29248): at android.hardware.Camera.takePicture(Camera.java:829)
10-24 12:20:57.846 E/AndroidRuntime(29248): at android.hardware.Camera.takePicture(Camera.java:793)

非常感谢您的帮助

这是一个安全问题。在没有预览视图的情况下,你不应该被允许使用相机。这应该可以防止在用户不知情的情况下恶意使用摄像头,例如用于间谍目的。

大多数现代安卓设备现在似乎都在检查是否存在
SurfaceView
,并且具有非零宽度和高度(我的三星Galaxy SII在这种情况下会发出警告,并且不会捕获照片)。有趣的是,如果
SurfaceView
的宽度和高度为
1dip
,那么它就可以正常工作

<SurfaceView android:id="@+id/surface_view"
    android:layout_width="1dip"
    android:layout_height="1dip" />


由于
SurfaceView的宽度和高度均为1像素,因此非常难以看到,虽然它可以正常工作,但仍然属于“安全问题”类别。

请添加异常的堆栈跟踪,并仔细阅读logcat输出,特别是,如果相机被访问,摩托罗拉机器人会记录很多有用的信息。谢谢@HefferWolf的回答。是的,很抱歉,这是堆栈跟踪:java.lang.RuntimeException:takePicture在android.hardware.Camera.native\u takePicture(本机方法)在android.hardware.Camera.takePicture(Camera.java:829)在android.hardware.Camera.takePicture(Camera.java:793)失败,这就是我想象的。摩托罗拉可能出于隐私的原因实施了这样的事情。不管怎么说,如果有其他的解决办法,而不是在虚拟活动上设置0大小的预览,那就太好了。实现它的不是摩托罗拉,而是所有不遵守指导原则的人:)呵呵,谢谢你指出:)我用LogCat输出编辑了我的帖子。你是否仍然认为缺乏实际预览的原因?你对此信息有参考吗?另外,事情还是这样吗?看来新的camera2()API更灵活了,我将在一个真实的设备上检查它,并相应地修改答案。