/** {@inheritDoc} */
  @Override
  public void close(final CameraSession session) {
    Descriptor descriptor = (Descriptor) session.getDescriptor();
    Camera camera = descriptor.getCamera();

    if (camera != null) {
      camera.stopPreview();
      camera.release();
      descriptor.setCamera(null);
    }

    session.destroy();
    getBus().post(new ClosedEvent());
  }
Пример #2
0
  /** {@inheritDoc} */
  public void takePicture(CameraSession session, PictureTransaction xact) {
    final Session s = (Session) session;

    s.reader.setOnImageAvailableListener(
        new TakePictureTransaction(session.getContext(), getBus(), xact), handler);

    getThreadPool()
        .execute(
            new Runnable() {
              @Override
              public void run() {
                try {
                  // This is how to tell the camera to lock focus.
                  s.previewRequestBuilder.set(
                      CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
                  s.captureSession.setRepeatingRequest(
                      s.previewRequestBuilder.build(), new RequestCaptureTransaction(s), handler);
                } catch (Exception e) {
                  getBus().post(new PictureTakenEvent(e));

                  if (isDebug()) {
                    Log.e(getClass().getSimpleName(), "Exception taking picture", e);
                  }
                }
              }
            });
  }
Пример #3
0
  /** {@inheritDoc} */
  @Override
  public void close(final CameraSession session) {
    final Session s = (Session) session;

    try {
      lock.acquire();

      if (s.captureSession != null) {
        closeLatch = new CountDownLatch(1);
        s.captureSession.close();
        closeLatch.await(2, TimeUnit.SECONDS);
        s.captureSession = null;
      }

      if (s.cameraDevice != null) {
        s.cameraDevice.close();
        s.cameraDevice = null;
      }

      if (s.reader != null) {
        s.reader.close();
      }

      Descriptor camera = (Descriptor) session.getDescriptor();

      camera.setDevice(null);
      getBus().post(new ClosedEvent());
    } catch (Exception e) {
      getBus().post(new ClosedEvent(e));
    } finally {
      lock.release();
    }
  }
  @Override
  public void stopVideoRecording(CameraSession session) throws Exception {
    Descriptor descriptor = (Descriptor) session.getDescriptor();
    Camera camera = descriptor.getCamera();

    if (camera != null) {
      MediaRecorder tempRecorder = recorder;

      recorder = null;
      tempRecorder.stop();
      tempRecorder.release();
      camera.reconnect();
      camera.startPreview();
    }

    getBus().post(new VideoTakenEvent(xact));
    xact = null;
  }
  @Override
  public void recordVideo(CameraSession session, VideoTransaction xact) throws Exception {
    Descriptor descriptor = (Descriptor) session.getDescriptor();
    Camera camera = descriptor.getCamera();

    if (camera != null) {
      camera.stopPreview();
      camera.unlock();

      try {
        recorder = new MediaRecorder();
        recorder.setCamera(camera);
        recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        int cameraId = descriptor.getCameraId();
        boolean canGoHigh = CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_HIGH);
        boolean canGoLow = CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_LOW);

        if (canGoHigh && (xact.getQuality() == 1 || !canGoLow)) {
          recorder.setProfile(CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH));
        } else if (canGoLow) {
          recorder.setProfile(CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_LOW));
        } else {
          throw new IllegalStateException("cannot find valid CamcorderProfile");
        }

        recorder.setOutputFile(xact.getOutputPath().getAbsolutePath());
        recorder.setMaxFileSize(xact.getSizeLimit());
        recorder.setMaxDuration(xact.getDurationLimit());
        recorder.setOnInfoListener(this);
        // recorder.setOrientationHint(...);
        recorder.prepare();
        recorder.start();
        this.xact = xact;
      } catch (IOException e) {
        recorder.release();
        recorder = null;
        throw e;
      }
    }
  }