2012-12-28 17 views
2

我對Android非常陌生,因此我的代碼不是來自我,因爲我只用它來學習。
我想製作的應用程序必須顯示相機預覽。我在表面上預覽了相機,但沒有集中注意力。作爲解決方法,我製作了一個可每隔750毫秒調用一次自動對焦的可運行程序。如何讓android相機預覽保持專注?

我想知道如何讓這個更好,因爲每當我打電話給自動對焦時,預覽都會模糊,直到它重新聚焦爲止。

謝謝你的幫助。

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" />