当尝试从服务(无 GUI)拍照时,在某些设备上,我收到 RuntimeException。但是,如果我使用 SurfaceHolder 从 Activity 中拍照,它就会起作用。
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 方法(实际上是 native 方法)的调用将抛出 RuntimeException。也试过 camera.setPreviewDisplay(null),但也不行。
但是,如果我使用 Activity 中的真实 SurfaceView,它在 Droid 上也能正常工作,但我需要从后台服务中进行操作。
您是否认为这种行为是出于隐私原因而显示的,因此没有人可以在不实际显示图像的情况下拍照?这对我来说没有多大意义,因为我可以加载一个预览大小为 0 的虚拟 Activity 并且它可以工作,但我希望不必这样做。
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)
非常感谢任何帮助
最佳答案
这是一个安全问题。你不应该被允许在没有预览 View 的情况下使用相机。这应该可以防止在用户不知情的情况下恶意使用相机,例如用于 spy 目的。
关于Android 在没有 SurfaceHolder 的情况下拍照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7873403/