2012-12-28 2 views
2

나는 Android에만 익숙하다. 따라서이 코드는 배울 때에 만 사용한다.
내가 만들고 싶은 응용 프로그램은 카메라 미리보기를 보여 주어야합니다. 표면에 카메라의 미리보기가 있지만 초점은 맞지 않습니다. 해결 방법으로 나는 750ms마다 자동 초점을 호출하는 실행 파일을 만들었습니다.안드로이드 카메라 미리보기에 집중하는 방법?

자동 포커스를 호출 할 때마다 미리 초점이 흐려질 때까지 미리보기가 흐려지기 때문에 어떻게하면 더 잘 만들 수 있는지 알고 싶습니다.

도움 주셔서 감사합니다.

import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.AutoFocusCallback; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.widget.Toast; 

public class Draw extends Activity { 
    private SurfaceView preview = null; 
    private SurfaceHolder previewHolder = null; 
    private Camera camera = null; 
    private boolean inPreview = false; 
    private boolean cameraConfigured = false; 
    private Handler handler = new Handler();; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.draw); 

     preview = (SurfaceView) findViewById(R.id.preview); 
     previewHolder = preview.getHolder(); 
     previewHolder.addCallback(surfaceCallback); 

     final Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       camera.autoFocus(autoFocusCallback); 
       handler.postDelayed(this, 1000); 
      } 
     }; 
     handler.postDelayed(r, 750); 
    } 

    private AutoFocusCallback autoFocusCallback = new AutoFocusCallback() { 

     @Override 
     public void onAutoFocus(boolean autoFocusSuccess, Camera arg1) { 
     } 
    }; 

    @Override 
    public void onResume() { 
     super.onResume(); 

     camera = Camera.open(); 
     startPreview(); 
    } 

    @Override 
    public void onPause() { 
     if (inPreview) { 
      camera.stopPreview(); 
     } 

     camera.release(); 
     camera = null; 
     inPreview = false; 

     super.onPause(); 
    } 

    private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { 
     Camera.Size result = null; 

     for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
      if (size.width <= width && size.height <= height) { 
       if (result == null) { 
        result = size; 
       } else { 
        int resultArea = result.width * result.height; 
        int newArea = size.width * size.height; 

        if (newArea > resultArea) { 
         result = size; 
        } 
       } 
      } 
     } 
     return (result); 
    } 

    private void initPreview(int width, int height) { 
     if (camera != null && previewHolder.getSurface() != null) { 
      try { 
       camera.setPreviewDisplay(previewHolder); 
      } catch (Throwable t) { 
       Log.e("KritzelKunst-surfaceCallback", "Exception in setPreviewDisplay()", t); 
       Toast.makeText(Draw.this, t.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

      if (!cameraConfigured) { 
       Camera.Parameters parameters = camera.getParameters(); 
       Camera.Size size = getBestPreviewSize(width, height, parameters); 

       if (size != null) { 
        parameters.setPreviewSize(size.width, size.height); 
        camera.setParameters(parameters); 
        cameraConfigured = true; 
       } 
      } 
     } 
    } 

    private void startPreview() { 
     if (cameraConfigured && camera != null) { 
      camera.startPreview(); 
      inPreview = true; 
     } 
    } 

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      // no-op -- wait until surfaceChanged() 
     } 

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

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      // no-op 
     } 
    }; 
} 

답변

1

시도 매니페스트에

<uses-feature android:name="android.hardware.camera.autofocus" /> 

를 추가.

관련 문제