2017-06-13 2 views
0

償却されたCamera APIを使用しています。私の目標は、1分に1回10分の写真を撮ることです。そのため、私のイメージキャプチャを呼び出すカウントダウンタイマーがあります。最初のイメージキャプチャは、時間の100%美しく動作します。後続の写真は様々な程度に焦点が外れています。なぜどんなアイデア?この写真は、次の画像キャプチャが呼び出されるずっと前にキャプチャされ、書き込まれているので、あまりにも速く起こっているとは思われません。Androidカメラのキャプチャ間のフォーカスが外れる

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_apicTimer); 

    imageView = (ImageView) findViewById(R.id.ViewImg); 

    SurfaceView surfaceView; 
    surfaceView = (SurfaceView) findViewById(R.id.SurfaceView); 
    surfaceView.setEnabled(false); 

    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    //Calls the timer 
    picLoop(); 
} 

public void picLoop(){ 

    timer = new CountDownTimer(totalTime,60000){ //(time in ms, tick length) 

     public void onFinish(){ 
     } 

     public void onTick(long millisUntilFinished){ 

       captureImage(); 
     } 
    }.start(); 

public void captureImage() { 

    //Need to wait a sec for the surface to form before we ask for autofocus 
    new CountDownTimer(3000,500){ //1000 ms, 500ms tick 
     public void onFinish(){ 
      camera.autoFocus(autoFocusCB); 
     } 
     public void onTick(long millisUntilFinished){ 

     }}.start(); 

    //When autofocused, take the picture 
    autoFocusCB = new android.hardware.Camera.AutoFocusCallback() { 
     @Override 
     public void onAutoFocus(boolean success, android.hardware.Camera camera) { 

      camera.takePicture(null, null, jpegCallback); 

     } 
    }; 

    //When the picture exists, save and display 
    jpegCallback = new android.hardware.Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 
      picData = data; 
      displayPic(data); //call to a function to display to an imageview 
     } 
    }; 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try{ 
     camera = android.hardware.Camera.open(); 
    } 
    catch (RuntimeException e){ 
     System.err.println(e); 
     return; 
    } 

    List<Camera.Size> picSizes; 
    android.hardware.Camera.Size largestSize; 
    android.hardware.Camera.Parameters param; 
    param = camera.getParameters(); 
    param.setPreviewSize(352, 288); 
    param.setFlashMode(FLASH_MODE_AUTO); 
    //param.setFocusMode(FOCUS_MODE_AUTO); 
    param.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE);  
    param.setPictureSize(1952,1952); 
    param.setJpegQuality(100); 
    param.setExposureCompensation(param.getMinExposureCompensation()); 
    param.setWhiteBalance(WHITE_BALANCE_AUTO); 
    camera.setParameters(param); 

    try { 
     camera.setPreviewDisplay(surfaceHolder); 
     camera.startPreview(); 
    } 

    catch (Exception e) { 
     System.err.println(e); 
    } 
} 


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    refreshCamera(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
} 

private void refreshCamera() { 
    if (surfaceHolder.getSurface() == null) { 
     return; 
    } 

    try { 
     camera.stopPreview(); 
    } 

    catch (Exception e) { 
     System.err.println(e); 
     return; 
    } 

    try { 
     camera.setPreviewDisplay(surfaceHolder); 
     camera.startPreview(); 

    } 
    catch (Exception e) { 
    } 
} 



} 
+0

を使用すると、異なる焦点モードを使用してみましたか?たとえば、FOCUS_MODE_AUTOまたは\t FOCUS_MODE_CONTINUOUS_VIDEOの効果を確認できます。これは、コードをすばやく見ているだけで、決定的な回答ではありません。 –

+0

はい、あります。実際には、FOCUS_MODE_AUTOがおそらく最も効果的です(私の例ではコメントアウトされていますが)。 – emhomm4

答えて

0

私はカメラを閉じて、すべてのキャプチャの間にそれを完全に開く必要がありました。

ので、これはすべてのキャプチャ後:

camera.stopPreview(); 
    camera.release(); 
    camera = null; 

その後、すべての撮影の前に、この:

try{ 
    camera = android.hardware.Camera.open(); 
} 
catch (RuntimeException e){ 
    System.err.println(e); 
    return; 
} 

List<Camera.Size> picSizes; 
android.hardware.Camera.Size largestSize; 
android.hardware.Camera.Parameters param; 
param = camera.getParameters(); 
param.setPreviewSize(352, 288); 
param.setFlashMode(FLASH_MODE_AUTO); 
param.setFocusMode(FOCUS_MODE_AUTO);  
param.setPictureSize(1952,1952); 
param.setJpegQuality(100); 
param.setExposureCompensation(param.getMinExposureCompensation()); 
param.setWhiteBalance(WHITE_BALANCE_AUTO); 
camera.setParameters(param); 

try { 
    camera.setPreviewDisplay(surfaceHolder); 
    camera.startPreview(); 
} 

catch (Exception e) { 
    System.err.println(e); 
} 
関連する問題