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, 0, data.length))); } catch (FileNotFoundException e) { Log.e("TAG", "File Note Found", e); } catch (IOException e) { Log.e("TAG", "IO Exception", e); } } }; }

classes_activity_takephoto.xml代码如下:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns: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-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.camera.autofocus"/>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-07-29 19:22:28

Android自定义相机实现自动对焦和手动对焦的相关文章

Android自定义相机实现自动对焦和手动对焦_Android

Android自定义相机实现自动对焦和手动对焦: 不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求. 所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此demo. 程序实现代码如下: import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.la

android 自定义相机预览的问题

问题描述 android 自定义相机预览的问题 我现在刚学的android,然后做了一个相机的应用,预览的时候在avd上运行都是竖屏的,图像也没有变形,但是换到手机上就变成90度了图像也被拉长了,照着网上好多方法改在手机上都不行,avd上没问题,请问下这可能是什么原因?我手机是三星的.

Android 自定义相机及分析源码

Android 自定义相机及分析源码 使用Android 系统相机的方法: 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 <intent-filter> <action android:name="android.intent.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" />

android 自定义相机

老规矩,先上一下项目地址:GitHub:https://github.com/xiangzhihong/CameraDemo 方式: 调用Camera API 自定义相机 调用系统相机 由于需求不同,所以选择的方案固然也不同,至于第二种调用系统相机,这里就不过多讲解了,使用Intent对象设置一个Action动作即可,跳转时使用startActivityForResult,然后在onActivityResult处理相关数据便可,关键代码: [java] view plain copy  prin

Android自定义相机拍照、图片裁剪的实现

最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类似于小猿搜题.学霸君等app. 其实Android提供Intent让我们打开系统的相机,但是系统相机跟自己app风格不搭,而且用起来体验不好.所以我使用了SDK提供的camera API自定义了一个相机,并且在相机界面上面添加了参考线,有助于用户将题目拍正,提高ocr的识别率. 1.绘制参考线的代码 1 public class ReferenceL

Android自定义相机界面的实现代码

我们先实现拍照按钮的圆形效果哈,Android开发中,当然可以找美工人员设计图片,然后直接拿进来,不过我们可以自己写代码实现这个效果哈,最常用的的是用layout-list实现图片的叠加,我们这个layout命名为btn_take_photo.xml,这是一个自定义的drawable文件,所以按照规范,我们要将它放在drawable文件夹里. 注意:drawable文件夹一般是来放自定义的drawable文件的,可以将它看成自己写的背景样式等等哦 解释代码: layer-list里面放3个ite

android自定义相机黑屏问题

对于一些手机,像HTC,当自定义Camera时,调用Camera.Parameters的parameters.setPreviewSize(width,height)方法时,如果width和height为奇数情况下,则会出现黑屏现象,解决办法可参考SDK提供的ApiDemos中关于Camera的例子: List<Size> sizes =parameters.getSupportedPreviewSizes(); Size optimalSize = getOptimalPreviewSize

Android自定义照相机详解_Android

启动相机的两种方式 1.直接启动系统相机 <code class="hljs avrasm"> Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);</code> 或者指定返回图片的名称mCurrentPhotoFile <code class="hljs avrasm"> In

自定义 amear- android自定义相机预览界面动态设置相机爆光值

问题描述 android自定义相机预览界面动态设置相机爆光值 android自定义相机预览界面动态设置相机爆光值 求高手请教:自己写了一个相机应用程序,使用SurfaceView方法自定义预览界面,可以正常预览,但是我想实现Android的系统照相机中可动态调整相机一些参数设置(例如 爆光值的增加.减小).大侠们有没有好的方法可以参考的,感谢 想实现效果如图: 解决方案 可以在SurfaceView rendered回调函数里面 用OpenGL 渲染一下,可以做到实时图像光照效果 解决方案二: