Android没有SurfaceHolder拍照

时间:2011-10-24 09:12:38

标签: android camera android-camera

当尝试从服务(无GUI)拍照时,在某些设备上,我收到RuntimeException。但是,如果我使用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),但它也无法正常工作。

但是,如果我在Activity中使用真正的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)

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

这是一个安全问题。如果不使用预览视图,则不应该使用相机。这可以防止在用户不知情的情况下恶意使用相机,例如用于间谍目的。

答案 1 :(得分:0)

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

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

宽度和高度为1像素,SurfaceView非常难以看清,虽然它有效,但它仍然属于“安全问题”类别。