大佬教程收集整理的这篇文章主要介绍了Android自定义相机实现自动对焦和手动对焦,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Android自定义相机实现自动对焦和手动对焦:
不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求。
所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此demo。
程序实现代码如下:
import java.io.File; import java.io.FileNotFoundException; import java.io.FiLeoutputStream; import java.io.IOException; import java.lang.reflect.Method; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.AutoFocusCallBACk; import android.hardware.Camera.Parameters; import android.hardware.Camera.PictureCallBACk; import android.hardware.Camera.ShutterCallBACk; import android.os.build; import android.os.bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.onClickListener; import android.widget.button; import com.hp.classes.config.Constants; import com.hp.classes.tools.CommonUtils; import com.hp.classeS.Ui.baseActivity; @SuppressWarnings("deprecation") public class PhotographActivity extends BaseActivity implements OnClickListener,SurfaceHolder.CallBACk { private SurfaceView surfaceView; private Camera camera; private Camera.Parameters parameters; private Button btn_goBACk,btn_takephoto; private SurfaceHolder surfaceHolder; @Override protected void onDestroy() { super.onDestroy(); if(camera != null){ camera.stopPreview(); camera.release(); camera = null; } } @Override protected void onCreate(Bundle savedInstanceStatE) { super.onCreate(savedInstanceStatE); setContentView(R.layout.classes_activity_takephoto); initView(); } @Override protected void onResume() { super.onResume(); initCamera(); } private void initView(){ 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 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 try { camera.setPreviewDisplay(surfaceHolder); } catch (IOException E) { 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) { camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦 doAutoFocus(); } } }); } // 相机参数的初始化设置 private void initCamera() { if (null == camera) { camera = Camera.open(); } parameters = camera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG); parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); if (!Build.MODEl.equals("KORIDY H30")) { 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如果要实现连续的自动对焦,这一句必须加上 } // 控制图像的正确显示方向 private void setDispaly(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 void onClick(View v) { switch (v.getId()) { case R.id.surfaceView: doAutoFocus(); break; case R.id.btn_takephoto: takePicture(); break; case R.id.btn_goBACk: finish(); break; default: break; } } // handle button auto focus private void doAutoFocus() { parameters = camera.getParameters(); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); camera.setParameters(parameters); camera.autoFocus(new AutoFocusCallBACk() { @Override public void onAutoFocus(Boolean success,Camera camera) { if (success) { camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。 if (!Build.MODEl.equals("KORIDY H30")) { 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); } } } }); } private void takePicture() { camera.takePicture(shutterCallBACk,rawCallBACk,jpegCallBACk); } // define shutterCallBACk ShutterCallBACk shutterCallBACk = new ShutterCallBACk() { public void onShutter() { // TODO Do something when the shutter closes. } }; PictureCallBACk rawCallBACk = new PictureCallBACk() { public void onPictureTaken(byte[] data,Camera camera) { // TODO Do something with the image RAW data. } }; // stroe the picture in format jpeg PictureCallBACk jpegCallBACk = new PictureCallBACk() { public void onPictureTaken(byte[] data,Camera camera) { // Save the image JPEG data to the SD card FiLeoutputStream outStream = null; try { //修改图片路径和名称 String tempFilename = String.valueOf(System.currentTimeMillis()) + ".jpg"; File folder = Constants.CACHE_FOLDER; if (!folder.isDirectory()) { folder.mkdirs(); } String path = Constants.CACHE_FOLDER + File.separator + tempFilename; outStream = new FiLeoutputStream(path); outStream.write(data); outStream.flush(); outStream.close(); surfaceView.setBACkgroundDrawable(new BitmapDrawable(BitmapFactory.decodeByteArray(data,data.length))); } catch (FileNotFoundException E) { Log.e("TAG","File Note Found",E); } catch (IOException E) { Log.e("TAG","IO Exception",E); } } }; }@H_301_11@
classes_activity_takephoto.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://scheR_525_11845@as.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>@H_301_11@
<uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.camera.autofocus"/>@H_301_11@
以上是大佬教程为你收集整理的Android自定义相机实现自动对焦和手动对焦全部内容,希望文章能够帮你解决Android自定义相机实现自动对焦和手动对焦所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。