當前位置:編程學習大全網 - 源碼下載 - 如何實現android手機攝像頭的的自動對焦

如何實現android手機攝像頭的的自動對焦

根據資料上顯示有如下幾種:

1 極端人物的做法: 使用壹個定時器,設定定時時間,然後不間斷的對焦。

2 極客人物的做法: 那就是利用驅動層實現,但是這個壹般人還是算了吧

3個人認為: 觀察系統的原生相機得知,這東東也沒用定時器啊,貌似也不可能復雜到全用驅動來實現,即使底層用的是C

實現,但是理論上講,google肯定會提供這個封裝好東東。於是果斷的去查閱 DOC 壹看,發現果然有這個東東 : 代碼如下

代碼如下:

public class MainActivity extends Activity {

private SurfaceView surfaceView;

private SurfaceHolder surfaceHolder;

private boolean flag = false;

private String fileUrl="";

Camera camera;

Camera.Parameters parameters;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);

Button button=(Button) findViewById(R.id.takepicture);

surfaceHolder = surfaceView.getHolder();

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceHolder.setKeepScreenOn(true);

surfaceView.setFocusable(true);

surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND);

surfaceHolder.addCallback(new Callback() {

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

camera.stopPreview();

camera.release();

camera=null;

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

if(null==camera){

camera=Camera.open();

try {

camera.setPreviewDisplay(surfaceHolder);

initCamera();

camera.startPreview();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int

height){

//實現自動對焦

camera.autoFocus(new AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

if(success){

initCamera();//實現相機的參數初始化

camera.cancelAutoFocus();//只有加上了這壹句,才會自動對焦。

}

}

});

}

});

}

//相機參數的初始化設置

private void initCamera()

{

parameters=camera.getParameters();

parameters.setPictureFormat(PixelFormat.JPEG);

//parameters.setPictureSize(surfaceView.getWidth(),

surfaceView.getHeight()); // 部分定制手機,無法正常識別該方法。

parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1連續對焦

setDispaly(parameters,camera);

camera.setParameters(parameters);

camera.startPreview();

camera.cancelAutoFocus();// 2如果要實現連續的自動對焦,這壹句必須加上

}

//控制圖像的正確顯示方向

private void setDispaly(Camera.Parameters parameters,Camera camera)

{

if (Integer.parseInt(Build.VERSION.SDK) >= 8){

setDisplayOrientation(camera,90);

}

else{

parameters.setRotation(90);

}

}

//實現的圖像的正確顯示

private void setDisplayOrientation(Camera camera, int i) {

Method downPolymorphic;

try{

downPolymorphic=camera.getClass().getMethod("setDisplayOrientation", new

Class[]{int.class});

if(downPolymorphic!=null) {

downPolymorphic.invoke(camera, new Object[]{i});

}

}

catch(Exception e){

Log.e("Came_e", "圖像出錯");

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is

present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

  • 上一篇:OS X下哪款郵件客戶端最值得推薦?為什麽
  • 下一篇:怎樣提取rom中的應用程序apk文件直接可以裝嗎?
  • copyright 2024編程學習大全網