2011-11-08 5 views
4

私はautofoucsを使用しようとしていますどこにオートフォーカスを置くべきかわかりません誰にもオートフォーカスを実装する方法がありますか?クラスに自動焦点を置く場所androidカメラ

----------プレビュークラス----------

package com.marakana; 

import java.io.IOException; 

import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.PreviewCallback; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

class Preview extends SurfaceView implements SurfaceHolder.Callback { // <1> 
private static final String TAG = "Preview"; 

SurfaceHolder mHolder; // <2> 
public Camera camera; // <3> 

Preview(Context context) { 
super(context); 

// Install a SurfaceHolder.Callback so we get notified when the 
// underlying surface is created and destroyed. 
mHolder = getHolder(); // <4> 
mHolder.addCallback(this); // <5> 
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // <6> 
} 

// Called once the holder is ready 
public void surfaceCreated(SurfaceHolder holder) { // <7> 
// The Surface has been created, acquire the camera and tell it where 
// to draw. 
camera = Camera.open(); // <8> 
try { 
    camera.setPreviewDisplay(holder); // <9> 

    camera.setPreviewCallback(new PreviewCallback() { // <10> 
    // Called for each frame previewed 
    public void onPreviewFrame(byte[] data, Camera camera) { // <11> 
     Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis()); 
     Preview.this.invalidate(); // <12> 
    } 
    }); 
} catch (IOException e) { // <13> 
    e.printStackTrace(); 
    } 
    } 

// Called when the holder is destroyed 
public void surfaceDestroyed(SurfaceHolder holder) { // <14> 
camera.stopPreview(); 
camera = null; 
} 

// Called when holder has changed 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // <15> 
    camera.startPreview(); 
} 

} 

-----------------カメラ活動------------------------

preview = new Preview(this); // <3> 
((FrameLayout) findViewById(R.id.preview)).addView(preview); // <4> 

buttonClick = (Button) findViewById(R.id.buttonClick); 
buttonClick.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { // <5> 

     preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 
}); 

// Handles data for jpeg picture 
PictureCallback jpegCallback = new PictureCallback() { // <8> 
public void onPictureTaken(byte[] data, Camera camera) { 
    FileOutputStream outStream = null; 
    try { 
    // Write to SD Card 

    outStream = new FileOutputStream(imgPath); // <9> 
    outStream.write(data); 
    outStream.close(); 
    intImg = new Intent(CameraActivity.this, DisplayImg.class); 
    intImg.putExtra("imgPath",imgPath); 
    startActivity(intImg); 
    Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
    } catch (FileNotFoundException e) { // <10> 
    e.printStackTrace(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } finally { 
    } 
    Log.d(TAG, "onPictureTaken - jpeg"); 
} 
}; 

答えて

-1

あなたが取る前に、あなたはそれを使用することができます画像。表面には

preview.camera.autoFocus(null) // you can make optional callback once focus is achieved 
preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 

変更およびプレビューする前に、あなたは、自動的に焦点距離を設定し、その後、プレビューを開始し、表示されているもので、その後、オートフォーカスますオートフォーカス設定を使用することができます。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

// Set camera properties first 
Camera.Parameters parameters = camera.getParameters(); 
     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
     camera.setParameters(parameters); 

camera.startPreview(); 

camera.autoFocus(null); 
} 
+0

写真を撮る前に、ピントを待つ必要があります。そうでない場合は無用です – Kasas

14

あなたはオートフォーカスを設定している場合、あなたはこのような何か行う必要があります。

camera.autoFocus(new AutoFocusCallback() { 
     @Override 
     public void onAutoFocus(boolean success, Camera camera) { 
      if(success){ 
       camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     } 
    }); 

オートフォーカス用カメラが待機方法ですそれを;)

+1

これは正解とマークする必要があります。 – bcorso

1

APIレベル9ので、Autoを実装することができますこのように(自動的に)フォーカスする:

surfaceChanged()メソッドでは、次のように変更してください。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

// Set camera properties first 
Camera.Parameters parameters = camera.getParameters(); 
     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
     camera.setParameters(parameters); 

camera.startPreview(); 

camera.autoFocus(null); 
} 
関連する問題