2015-10-06 14 views
8

Tôi đang cố gắng tạo ứng dụng chụp một số ảnh từ dịch vụ bằng cách sử dụng camera2 API.Camera2 API onCaptureComplete() được gọi nhưng trạng thái camera vẫn là CONTROL_AE_STATE_PRECAPTURE

Tôi có thể khiến ứng dụng chụp ảnh đẹp từ một đoạn dựa trên Camera2Basic sample.

Nhưng khi tôi thử chuyển sang dịch vụ, hình ảnh không hoàn thành chụp chính xác. Nó không bao giờ tiến triển qua trạng thái precapture autoexposure.

Tôi đã thu hẹp nó xuống là một số vấn đề khi không có bản xem trước. Tôi đã đặt cùng một đoạn thử nghiệm bằng cách lấy mã số Camera2Basic và xóa bản xem trước, dẫn đến cùng một vấn đề.

Tôi đặt cùng một đoạn thử nghiệm có vấn đề, dựa trên mẫu Camera2Basic, nơi tôi vừa xóa mã để xem trước. Mã phân đoạn được tải lên tại đây http://pastebin.ca/3182401.

Tôi nhận được callback onCaptureCompleted() nhưng khi tôi kiểm tra tình trạng máy ảnh autoexposure đây, nó vẫn còn trong CONTROL_AE_STATE_PRECAPTURE nhà nước.

Điều đó không có ý nghĩa với tôi rằng quá trình chụp sẽ hoàn tất nếu một trong các trạng thái camera vẫn ở trạng thái sẵn sàng.

Bất cứ ai biết điều gì có thể xảy ra ở đây?

+0

Có thể sau khi chụp ảnh, máy ảnh quay trở lại trạng thái trước để chuẩn bị cho ảnh tiếp theo? – Jani

+0

Không nên là trường hợp. Tài liệu nói rằng nó nên khóa trên trạng thái CONVERGED hoặc FLASH_REQUIRED. Sau đó, vẫn bị khóa cho đến khi ảnh được chụp hoặc ứng dụng gửi yêu cầu với android.control.aeLock == true, theo sau là yêu cầu với android.control.aeLock == false https://developer.android.com/reference/ android/hardware/camera2/CaptureRequest.html # CONTROL_AE_PRECAPTURE_TRIGGER – user2128112

+0

Tôi đang nhận 'CONTROL_AE_STATE' luôn là null. Bất kỳ ý tưởng tại sao? tôi đang sử dụng cùng một mẫu. Và đã thử trên nhiều thiết bị. – iMDroid

Trả lời

0

Tôi nghĩ rằng có một lỗ hổng trong logic nơi bạn đặt mState của bạn như chụp trước nhà nước

private void process(CaptureResult result) { 
     switch (mState) { 
      case STATE_PREVIEW: { 
       // We have nothing to do when the camera preview is working normally. 
       break; 
      } 
      case STATE_WAITING_LOCK: { 
       Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); 
       if (afState == null) { 
        captureStillPicture(); 
       } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState || 
         CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) { 
        // CONTROL_AE_STATE can be null on some devices 
        Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); 
        if (aeState == null || 
          aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) { 
         mState = STATE_PICTURE_TAKEN; 
         captureStillPicture(); 
        } else { 
         runPrecaptureSequence(); 
        } 
       } 
       break; 
      } 
      case STATE_WAITING_PRECAPTURE: { 
       // CONTROL_AE_STATE can be null on some devices 
       Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); 
       if (aeState == null || 
         aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE || 
         aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) { 
        mState = STATE_WAITING_NON_PRECAPTURE; 
       } 
       break; 
      } 
      case STATE_WAITING_NON_PRECAPTURE: { 
       // CONTROL_AE_STATE can be null on some devices 
       Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); 
       if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) { 
        mState = STATE_PICTURE_TAKEN; 
        captureStillPicture(); 
       } 
       break; 
      } 
     } 
    } 

Sẽ là trường hợp STATE_WAITING_PRECAPTURE thậm chí được nhập ở tất cả?

0

Nó không được đề cập trong tài liệu, nhưng onCaptureCompleted thực sự được gọi khi yêu cầu được gửi, chứ không phải khi trình tự lấy trước hoặc tự động lấy nét đã kết thúc. Camera2Basic dựa trên việc xem trước chạy liên tục, vì xem trước hoạt động như một màn hình liên tục cho trạng thái của máy ảnh. Nếu không có nó, bạn sẽ không biết khi nào trình tự precapture thực sự kết thúc.

Các vấn đề liên quan