Android自定义相机实现自动对焦和手动对焦
Android自定义相机实现自动对焦和手动对焦:
不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求。
所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此demo。
程序实现代码如下:
importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.lang.reflect.Method; importandroid.graphics.PixelFormat; importandroid.hardware.Camera; importandroid.hardware.Camera.AutoFocusCallback; importandroid.hardware.Camera.Parameters; importandroid.hardware.Camera.PictureCallback; importandroid.hardware.Camera.ShutterCallback; importandroid.os.Build; importandroid.os.Bundle; importandroid.util.Log; importandroid.view.SurfaceHolder; importandroid.view.SurfaceView; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importcom.hp.classes.config.Constants; importcom.hp.classes.tools.CommonUtils; importcom.hp.classes.ui.BaseActivity; @SuppressWarnings("deprecation") publicclassPhotographActivityextendsBaseActivityimplementsOnClickListener,SurfaceHolder.Callback{ privateSurfaceViewsurfaceView; privateCameracamera; privateCamera.Parametersparameters; privateButtonbtn_goback,btn_takephoto; privateSurfaceHoldersurfaceHolder; @Override protectedvoidonDestroy(){ super.onDestroy(); if(camera!=null){ camera.stopPreview(); camera.release(); camera=null; } } @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.classes_activity_takephoto); initView(); } @Override protectedvoidonResume(){ super.onResume(); initCamera(); } privatevoidinitView(){ btn_goback=(Button)findViewById(R.id.btn_goback); btn_goback.setOnClickListener(this); btn_takephoto=(Button)findViewById(R.id.btn_takephoto); btn_takephoto.setOnClickListener(this); surfaceView=(SurfaceView)findViewById(R.id.surfaceView); surfaceView.setFocusable(true); surfaceView.setOnClickListener(this); surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND); surfaceHolder=surfaceView.getHolder(); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceHolder.setKeepScreenOn(true); surfaceHolder.setFixedSize(400,300); surfaceHolder.addCallback(this); } @Override publicvoidsurfaceDestroyed(SurfaceHolderholder){ //TODOAuto-generatedmethodstub camera.stopPreview(); camera.release(); camera=null; } @Override publicvoidsurfaceCreated(SurfaceHolderholder){ //TODOAuto-generatedmethodstub try{ camera.setPreviewDisplay(surfaceHolder); }catch(IOExceptione){ e.printStackTrace(); } } @Override publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){ //实现自动对焦 camera.autoFocus(newAutoFocusCallback(){ @Override publicvoidonAutoFocus(booleansuccess,Cameracamera){ if(success){ camera.cancelAutoFocus();//只有加上了这一句,才会自动对焦 doAutoFocus(); } } }); } //相机参数的初始化设置 privatevoidinitCamera(){ if(null==camera){ camera=Camera.open(); } parameters=camera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG); parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); if(!Build.MODEL.equals("KORIDYH30")){ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1连续对焦 }else{ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); } camera.setParameters(parameters); setDispaly(camera); camera.startPreview(); camera.cancelAutoFocus();//2如果要实现连续的自动对焦,这一句必须加上 } //控制图像的正确显示方向 privatevoidsetDispaly(Cameracamera){ if(Integer.parseInt(Build.VERSION.SDK)>=8){ setDisplayOrientation(camera,-90); }else{ parameters.setRotation(-90); } } //实现的图像的正确显示 privatevoidsetDisplayOrientation(Cameracamera,inti){ MethoddownPolymorphic; try{ downPolymorphic=camera.getClass().getMethod("setDisplayOrientation",newClass[]{int.class}); if(downPolymorphic!=null){ downPolymorphic.invoke(camera,newObject[]{i}); } }catch(Exceptione){ Log.e("Came_e","图像出错"); } } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.surfaceView: doAutoFocus(); break; caseR.id.btn_takephoto: takePicture(); break; caseR.id.btn_goback: finish(); break; default: break; } } //handlebuttonautofocus privatevoiddoAutoFocus(){ parameters=camera.getParameters(); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); camera.setParameters(parameters); camera.autoFocus(newAutoFocusCallback(){ @Override publicvoidonAutoFocus(booleansuccess,Cameracamera){ if(success){ camera.cancelAutoFocus();//只有加上了这一句,才会自动对焦。 if(!Build.MODEL.equals("KORIDYH30")){ parameters=camera.getParameters(); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1连续对焦 camera.setParameters(parameters); }else{ parameters=camera.getParameters(); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); camera.setParameters(parameters); } } } }); } privatevoidtakePicture(){ camera.takePicture(shutterCallback,rawCallback,jpegCallback); } //defineshutterCallback ShutterCallbackshutterCallback=newShutterCallback(){ publicvoidonShutter(){ //TODODosomethingwhentheshuttercloses. } }; PictureCallbackrawCallback=newPictureCallback(){ publicvoidonPictureTaken(byte[]data,Cameracamera){ //TODODosomethingwiththeimageRAWdata. } }; //stroethepictureinformatjpeg PictureCallbackjpegCallback=newPictureCallback(){ publicvoidonPictureTaken(byte[]data,Cameracamera){ //SavetheimageJPEGdatatotheSDcard FileOutputStreamoutStream=null; try{ //修改图片路径和名称 StringtempFilename=String.valueOf(System.currentTimeMillis())+".jpg"; Filefolder=Constants.CACHE_FOLDER; if(!folder.isDirectory()){ folder.mkdirs(); } Stringpath=Constants.CACHE_FOLDER+File.separator+tempFilename; outStream=newFileOutputStream(path); outStream.write(data); outStream.flush(); outStream.close(); surfaceView.setBackgroundDrawable(newBitmapDrawable(BitmapFactory.decodeByteArray(data,0,data.length))); }catch(FileNotFoundExceptione){ Log.e("TAG","FileNoteFound",e); }catch(IOExceptione){ Log.e("TAG","IOException",e); } } }; }
classes_activity_takephoto.xml代码如下:
<?xmlversion="1.0"encoding="utf-8"?> <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_toLeftOf="@+id/rlright"/> <LinearLayout android:id="@+id/rlright" android:layout_width="40dp" android:layout_height="match_parent" android:layout_alignParentRight="true" android:background="#2b2b2b" android:gravity="center_horizontal" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="0dip" android:layout_weight="1" android:gravity="center"> <Button android:id="@+id/btn_goback" style="@style/PETextButton" android:text="返回"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="0dip" android:layout_weight="1" android:gravity="center"> <Button android:id="@+id/btn_takephoto" style="@style/PETextButton" android:text="拍照"/> </LinearLayout> </LinearLayout> </RelativeLayout>
在清单文件需要添加相应权限:
<uses-permissionandroid:name="android.permission.CAMERA"/> <uses-featureandroid:name="android.hardware.camera"/> <uses-featureandroid:name="android.hardware.camera.autofocus"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。