【问题标题】:android: camera is not taking a pictureandroid:相机没有拍照
【发布时间】:2015-05-16 11:54:24
【问题描述】:

这个想法很简单:我的应用程序应该创建一个相机对象,显示预览并拍照(不按任何按钮),然后关闭相机。不幸的是,它甚至没有拍照。 (意思是:我应该在拍照后执行的回调代码永远不会到达。)

我正在为 android camera api 使用一个小包装类。我的活动代码如下所示:

camera = new SurveillanceCamera(this, layoutForPreview);
camera.start();
camera.takePicture();

包装类:

public SurveillanceCamera(Context context, LinearLayout previewLayout) {
    cameraInstance = Camera.open(findBackFacingCamera());
    pictureCallback = getPictureCallback();
    cameraPreview = new CameraPreview(context, cameraInstance);
    this.previewLayout = previewLayout;
    this.previewLayout.addView(cameraPreview);
    cameraInstance.startPreview();
  }

  public void takePicture() {
    //this code is reached
    cameraInstance.takePicture(null, null, pictureCallback);
  }

  public void start() {
    if (cameraInstance == null) {
      cameraInstance = Camera.open(findBackFacingCamera());
      pictureCallback = getPictureCallback();
      cameraPreview.setCamera(cameraInstance);
      cameraInstance.startPreview();
    }
  }

  private PictureCallback getPictureCallback() {
    PictureCallback picture = new PictureCallback() {
      @Override
      public void onPictureTaken(byte[] data, Camera camera) {
        Log.e(TAG, "Jey picture was taken...");
        // refresh camera to continue preview
        cameraPreview.refreshCamera(cameraInstance);
      }
    };
    return picture;
  }

  private int findBackFacingCamera() {
    int cameraId = -1;
    // Search for the back facing camera
    // get the number of cameras
    int numberOfCameras = Camera.getNumberOfCameras();
    // for every camera check
    for (int i = 0; i < numberOfCameras; i++) {
      CameraInfo info = new CameraInfo();
      Camera.getCameraInfo(i, info);
      if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
        cameraId = i;
        break;
      }
    }
    return cameraId;
  }

代码中没有抛出异常,但是onPictureTaken中的Log.e()没有显示出来。似乎显示了相机预览,但没有任何反应。是否有可能在执行 camera.takePicture() 时预览没有完全加载?有什么建议吗?

【问题讨论】:

标签: android camera


【解决方案1】:

您的怀疑很可能是有道理的。我看不到何时调用 setPreviewDisplay()。但是这个调用应该完成,takePicture() 才能成功。

不可能简单地调用

camera = new SurveillanceCamera(this, layoutForPreview);
camera.start();
camera.takePicture();

因为要完成一个setPreviewDisplay()的调用,你需要一个完全初始化的Holder实例,但是你只需要在构造函数中添加表面视图。

最好注册一个SurfaceHolder.Callback 并从surfaceChanged() 回调中调用takePicture()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多