在那里把自动对焦的类Android摄像头 [英] where to put autofocus in the class android camera

查看:167
本文介绍了在那里把自动对焦的类Android摄像头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用autofoucs我不知道往哪里放自动对焦任何人有一个想法如何实现自动对焦?

---------- preVIEW类----------

 包com.marakana;

 进口java.io.IOException异常;

 进口android.content.Context;
 进口android.hardware.Camera;
 进口android.hardware.Camera previewCallback。
 进口android.util.Log;
 进口android.view.SurfaceHolder;
 进口android.view.SurfaceView;

类preVIEW延伸SurfaceView实现SurfaceHolder.Callback {//&其中1为卤素;
私有静态最后字符串变量=preVIEW;

SurfaceHolder mHolder; // 2>
公共摄像头摄像头; //&其中3的密度;

preVIEW(上下文的背景下){
超(上下文);

//安装SurfaceHolder.Callback所以我们得到通知时,该
//下垫面创建和销毁。
mHolder = getHolder(); //&所述; 4为H.
mHolder.addCallback(本); //&其中5个;
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //&其中; 6个
}

 //调用一次支架已准备就绪
公共无效surfaceCreated(SurfaceHolder持有者){//&其中7个;
//表面经创建,获取摄像机,并告诉它在哪里
//绘制。
相机= Camera.open(); //&其中8是氢;
尝试 {
  camera.set previewDisplay(保持器); //&其中9个;

  camera.set previewCallback(新previewCallback(){//小于10>
    //呼吁每一帧previewed
    在previewFrame(byte []的数据,摄像头摄像头){//&LT公共无效; 11>
      Log.d(关于previewFrame所谓的标签+ System.currentTimeMillis的());
      preview.this.invalidate(); //&其中12所取代;
     }
   });
 }赶上(IOException异常E){//< 13>
  e.printStackTrace();
   }
  }

 //当支架被破坏时调用
公共无效surfaceDestroyed(SurfaceHolder持有者){//&所述14取代;
camera.stop preVIEW();
摄像头= NULL;
}

//调用时,持有人已变更
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高){//< 15>
  camera.start preVIEW();
 }

}
 

-----------------摄像头活动------------------------

  preVIEW =新的preVIEW(本); //&其中3的密度;
((的FrameLayout)findViewById(R.id. preVIEW))addView(preVIEW)。 //&所述; 4为H.

buttonClick =(按钮)findViewById(R.id.buttonClick);
buttonClick.setOnClickListener(新OnClickListener(){
  公共无效的onClick(视图v){//小于5>

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

//处理数据的JPEG图片
PictureCallback jpegCallback =新PictureCallback(){//&所述8是氢;
公共无效onPictureTaken(byte []的数据,摄像头摄像头){
  FileOutputStream中outStream = NULL;
  尝试 {
    //写入SD卡

    outStream =新的FileOutputStream(imgPath); //&其中9个;
    outStream.write(数据);
    outStream.close();
    intImg =新的意图(CameraActivity.this,DisplayImg.class);
    intImg.putExtra(imgPath,imgPath);
    startActivity(intImg);
    Log.d(TAG,onPictureTaken  - 写字节:+ data.length);
  }赶上(FileNotFoundException异常E){//小于10>
    e.printStackTrace();
  }赶上(IOException异常E){
    e.printStackTrace();
  } 最后 {
  }
  Log.d(TAG,onPictureTaken  -  JPEG);
}
};
 

解决方案

如果您有自动对焦设置,你应该做的是这样的:

  camera.autoFocus(新AutoFocusCallback(){
        @覆盖
        公共无效onAutoFocus(布尔成功,相机摄像头){
            如果(成功){
                camera.takePicture(shutterCallback,rawCallback,jpegCallback);
            }
        }
    });
 

就是这样的相机等待自动对焦;)

I am trying to use autofoucs i have no idea where to put autofocus anyone has an idea how to implement autofocus?

----------preview class----------

 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();
 }

}

-----------------camera activity------------------------

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");
}
};

解决方案

If you have autofocus set, you should do something like this:

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

That's the way the camera waits for the autofocus ;)

这篇关于在那里把自动对焦的类Android摄像头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆