设为首页 加入收藏

TOP

如何实现Android手机摄像头的自动对焦(一)
2015-02-02 14:10:58 来源: 作者: 【 】 浏览:42
Tags:如何 实现 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().i

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Qt程序启动画面实现 下一篇Android实现简单的相机程序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: