按下按钮拍照并保存

10
我正在创建一个Android应用程序,其中使用用户捕获的图像作为更大过程的一部分。到目前为止,我的XML布局具有SurfaceView和Button,位于RelativeLayout内部。我已成功在SurfaceView上显示相机预览,但我卡在如何在用户按下按钮时拍照并保存它的地方。
我的类文件看起来像CameraPreview API演示: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html 理想情况下,当按下按钮时,相机应自动对焦,拍摄照片(带有点击声音),将其保存到/data/data/app_package_structure/files/file_name.jpg,然后弹出Toast告诉用户已保存他们的图像。
非常感谢任何帮助 :)
2个回答

12

我认为CommonsWare已经回答了这个问题的大部分内容,但是这个可以用于自动对焦和快门声。由于我不在能够编译/测试任何代码的机器上,所以这只是一个猜测。

在您的按钮按下处理代码中,我认为您应该调用(可能通过消息传递)。

camera.autoFocus(new Camera.AutoFocusCallback() {
  Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback() {
    public void onShutter() {
      // Play your sound here.
    }
  };
  public void onAutoFocus(boolean success, Camera camera) {
    camera.takePicture(shutterCallback, null, photoCallback);
  }
});  

这里的 camera 是您的相机对象,photoCallback 与 CommonsWare 的示例中一样。

您目前遇到的具体问题是什么?

哦,别忘了加上 <uses-feature> 标签 android.hardware.camera.autofocus。 :)


这是非常好的帮助。我的自动对焦现在运作得很好。我只有一个障碍需要克服,那就是保存图片。takePicture()返回什么?我在photoCallback中该怎么处理它?如何将结果保存为图像? - greenie
1
我的猜测是takePicture没有返回值,相反,照片以JPEG格式的字节数组通过其onPictureTaken(byte[] data, Camera camera)回调方法传递给了photoCallback。你可能只需要将这些字节直接写入文件即可。 - Mikael Ohlson
至少这是我从http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html和http://developer.android.com/reference/android/hardware/Camera.html#takePicture%28android.hardware.Camera.ShutterCallback,%20android.hardware.Camera.PictureCallback,%20android.hardware.Camera.PictureCallback%29获取的印象。 - Mikael Ohlson
快门声应该在传递给takePicture的shutterCallback中。谢谢Mikael的提示! - just_another_coder

9
这是一个处理拍照并保存图片部分的示例应用程序。自动对焦、点击、Toast 和将图片保存到应用程序本地文件存储或 SD 卡上留给学生作为练习。:-)

这里有一个示例应用程序


谢谢您提供的示例(我之前已经看过了),但是我真正想要的是对我的问题有更完整的回答。 - greenie
@CommonsWare:只是一个更新——我在开发者文档中查看SurfaceHolder时发现,方法setType已被弃用,常量SURFACE_TYPE_PUSH_BUFFERS、SURFACE_TYPE_NORMAL、SURFACE_TYPE_HARDWARE和SURFACE_TYPE_GPU也是如此。 - Abhijit
@Abhijit:自Android 3.0起,它们已被弃用。您需要它们来支持Android 1.x和2.x。但在Android 3.x及更高版本中可以跳过它们。 - CommonsWare
@CommonsWare:感谢您的澄清! - Abhijit
@Commons 我使用了相同的代码,除了三星Galaxy S4之外,它都可以正常工作。 - Sagar Maiyad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接