[关闭]
@flyouting 2014-03-19T16:07:30.000000Z 字数 2890 阅读 5114

Android相机开发指南(四)

在Fragment中使用 Android’s Camera SurfaceView

这是基于Android Studio及Fragment的相机开发的第四章,如果你还没准备好,先去github上拉一下我的一个示例工程。本章主要包含“NativeCameraFragment.

作者注: 这个例子目前在“测试版”, 我将根据别人的建议更新改进它。完整的相机的例子是很复杂的,如果你想要一个完整的工程实现示例用在自己的项目中,可以考虑这个例子:CWAC。这里的目标只是演示基本主体。

除了Android的其他相机应用程序,您也可以把相机融合在你的应用程序本身中。这样做需要直接使用Android的相机,并把结果显示在“预览”面或SurfaceView。虽然这不是完美的(退出Fragment返回会崩溃),演示应用程序应该只是研究相机的一个起点。

直接打开相机

当Fragment的视图被创建时,首先是我们尝试绑定相机,获取相机预览。你可以在Google官方文档中阅读这个主题相关的资料。现在这里有个实现例子:

  1. private boolean safeCameraOpenInView(View view) {
  2. boolean qOpened = false;
  3. releaseCameraAndPreview();
  4. mCamera = getCameraInstance();
  5. qOpened = (mCamera != null);
  6. mPreview = new CameraPreview(getActivity().getBaseContext(), mCamera);
  7. FrameLayout preview = (FrameLayout) view.findViewById(R.id.camera_preview);
  8. preview.addView(mPreview);
  9. return qOpened;
  10. }

这段的功能是获取相机的实例,并附加到我们的CameraPreview上。

Camera Preview

这个CameraPreview继承SurfaceView和SurfaceHolder.callback。预览会显示相机的输入流,让你知道你所获取的图片是什么样的。它也负责管理SurfaceHolder本身的各种生命周期。

  1. /**
  2. * Surface on which the camera projects it's capture results.
  3. */
  4. class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
  5. SurfaceHolder mHolder;
  6. Camera mCamera;
  7. public CameraPreview(Context context, Camera camera) {
  8. super(context);
  9. mCamera = camera;
  10. // Install a SurfaceHolder.Callback so we get notified when the
  11. // underlying surface is created and destroyed.
  12. mHolder = getHolder();
  13. mHolder.addCallback(this);
  14. // deprecated setting, but required on Android versions prior to 3.0
  15. mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  16. }
  17. public void surfaceCreated(SurfaceHolder holder) {
  18. // The Surface has been created, now tell the camera where to draw
  19. // the preview.
  20. try {
  21. mCamera.setPreviewDisplay(holder);
  22. mCamera.startPreview();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. public void surfaceDestroyed(SurfaceHolder holder) {
  28. // empty. Take care of releasing the Camera preview in your
  29. // activity.
  30. }
  31. public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  32. // If your preview can change or rotate, take care of those events
  33. // here.
  34. // Make sure to stop the preview before resizing or reformatting it.
  35. if (mHolder.getSurface() == null) {
  36. // preview surface does not exist
  37. return;
  38. }
  39. // stop preview before making changes
  40. try {
  41. mCamera.stopPreview();
  42. } catch (Exception e) {
  43. // ignore: tried to stop a non-existent preview
  44. }
  45. // set preview size and make any resize, rotate or
  46. // reformatting changes here
  47. // start preview with new settings
  48. try {
  49. mCamera.setPreviewDisplay(mHolder);
  50. mCamera.startPreview();
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }

Camera Picture 回调

Camera.PictureCallback是Android中的一个方法,用于当相机拍了一张照片时获得输出的结果。这里实现如下:

  1. private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
  2. @Override
  3. public void onPictureTaken(byte[] data, Camera camera) {
  4. File pictureFile = getOutputMediaFile();
  5. if (pictureFile == null) {
  6. Toast.makeText(getActivity(), "Image retrieval failed.", Toast.LENGTH_SHORT).show();
  7. return;
  8. }
  9. try {
  10. FileOutputStream fos = new FileOutputStream(pictureFile);
  11. fos.write(data);
  12. fos.close();
  13. } catch (FileNotFoundException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. };

翻译:@flyouting
时间:2014/03/19
源地址

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注