2017-09-28 2 views
1

카메라 API를 사용하여 매초 10 초 동안 한 장의 사진을 찍는 앱을 만들려고합니다. 이 링크 Android Camera API에있는 자습서를 따라 코드를 수정하여 내 사진 목록을 가져 왔습니다 (아래 코드 참조). 이제 모든Android 카메라 사용 중지 takePreview on takePicture

... 완벽하게 작동, 문제입니다 (내 생각)는 미리을 정지하기 때문에, 내가 화면의 작은 순간을 일으키는 원인이되는 콜백 onPictureTaken에서 다시 시작해야 takePicture 방법에 동결. 안드로이드 카메라 문서에서

private void initializeCamera() { 
    // Create an instance of Camera 
    mCamera = getCameraInstance(); 

    // Create our Preview view and set it as the content of our activity. 
    CameraPreview mPreview = new CameraPreview(this, mCamera); 
    FrameLayout preview = findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 
    mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
     @Override 
     public void onPreviewFrame(byte[] bytes, Camera camera) { 
      startRecognition(); 
     } 
    }); 
} 


private PictureCallback mPicture = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     mCamera.startPreview(); // <----- Restart preview.. stop freeze 
     // Task to detect an object in the picture.. Do something 
    } 
}; 


public void startRecognition() { 
    if (SystemClock.elapsedRealtime() - startedTime > 10000) { 
     // Detection has failed.. Do something 
    } 
    else { 
     // Get a frame each second 
     if (SystemClock.elapsedRealtime() - elapsedTime > 1000) { 
      elapsedTime = SystemClock.elapsedRealtime(); 
      mCamera.takePicture(null, null, mPicture); // <---- Take picture but stop preview 
     } 
    } 
} 

은 :

8) 사진을 촬영 한 뒤, 미리보기 화면이 중지됩니다. 더 많은 사진을 찍으려면 먼저 startPreview()를 다시 호출하십시오.

그렇지 않으면 stopPreview, 또는 아무것도를 해제하는 방법이 있나요이 방법은 않는다는 것을, 내가 사진을 때?

도움 주셔서 감사합니다.

+0

https://developer.android.com/reference/android/hardware/Camera.html#release()를 시도하면 다음을 볼 수 있습니다. https://stackoverflow.com/questions/6200369/picturecallback-onpicturetaken-never- 호출 –

+0

작동하지 않습니다 ... – fattidare

답변

1

아마도 당신은 onPreviewFrame()에서 전달 된 해상도로 충분할 수 있습니까? 그런 다음 '사진 찍기' 이후에 카메라를 다시 시작할 필요가 없습니다. 실시간 미리보기가 고정되지 않습니다.

당신은 API와 장치를 대상으로하는 경우> = 21 (롤리팝), 대신 되지Camera API의 새로운 camera2 API를 사용해야합니다. 새로운 API는 많은 개선점을 가지고 있으며 그 중에서도 다중 이미지 캡처를 원활하게 수행 할 수 있습니다.

이전 API가 붙어 있더라도 몇 가지 개선 사항이 있습니다.

기존 코드의 문제점 중 하나는 UI 스레드에서 카메라 장치와 함께 작동한다는 것입니다. 오히려 use a background HandlerThread을 사용하여 카메라를 열고 onPictureTaken()이 미리보기를 다시 시작하고 평소대로 돌아가서 모든 처리를 또 다른 작업자 스레드로 오프로드해야합니다.

+1

나는 onPreviewFrame()에서 직접 이미지를 캡처하기로했습니다. 그것은 입력 데이터에 대한 일부 처리와 잘 작동합니다. – fattidare

관련 문제