1.布局中只有一个SurfaceView和Button,初始SurfaceView通过surface.getHolder获得SurfaceHolder类

       SurfaceView sfv= (SurfaceView) findViewById(R.id.surfaceView);
holder = sfv.getHolder();
//指定类型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//指定回调接口
holder.addCallback(new A());

2.回调接口。这里setPictureSize(width,height)宽高并不能随意设置,必须属于

myParameters.getSupportedPictureSizes()

中的,在该回调中并设置了
cam.autoFocus(mAutoFocusCallback);
实现cam的聚焦功能。
myParameters.set("jpeg-quality", 10);这里设置的10使得图片最终质量较差。

private class A implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(cam!=null){
cam.release();
}
cam = Camera.open(0);
try {
myParameters = cam.getParameters();
myParameters.setPictureSize(myParameters.getSupportedPictureSizes().get(0).width,myParameters.getSupportedPictureSizes().get(0).height);
for(int i=0;i<myParameters.getSupportedPictureSizes().size();i++){ Log.d(TAG, "surfaceCreated: width: "+myParameters.getSupportedPictureSizes().get(i).width+"height:"+myParameters.getSupportedPictureSizes().get(i).height);
}
myParameters.setFocusMode("auto");
myParameters.set("jpeg-quality", 10);
cam.setParameters(myParameters); cam.setPreviewDisplay(holder);
cam.setDisplayOrientation(90);
cam.startPreview();
cam.autoFocus(mAutoFocusCallback); } catch (Exception e) {
e.printStackTrace();
}
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override
public void surfaceDestroyed(SurfaceHolder holder) { }
}

3.cam.autoFocus(mAutoFocusCallback)中的回调

  private Camera.AutoFocusCallback mAutoFocusCallback=new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) { }
};

4.在Button点击事件中实现拍照响应

 cam.takePicture(null,null,null,new B());

5.B回调,压缩图片,并保存

 private class B implements Camera.PictureCallback {

        @Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap a= BitmapFactory.decodeByteArray(data,0,data.length); String fileAdress=Environment.getExternalStorageDirectory()+File.separator+"AA"+File.separator+photoFileName; FileOutputStream out=new FileOutputStream(new File(fileAdress));
//压缩
a.compress(Bitmap.CompressFormat.JPEG,100,out);
Toast.makeText(PhotoActivity.this,"",Toast.LENGTH_SHORT).show(); if(cam!=null){
cam.release();
}
finish();
} catch (Exception e) {
e.printStackTrace();
}
}
}

6.给surfaceView加上点击事件,点击时,开启聚焦

 sfv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
cam.autoFocus(mAutoFocusCallback);
return false;
}
});

surfaceView实现拍照功能的更多相关文章

  1. Android开发技巧——Camera拍照功能

    本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...

  2. UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)

    最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...

  3. 文件件监听器,android系统拍照功能调用后删除系统生成的照片

    先说说要实现的功能: android调用系统拍照功能实时 预览 删除 上传 保存 (用户不能再本地文件夹中看到拍的照片) 再说说遇到的问题: 1.调用系统拍照在系统自带的拍照文件夹中生成一张随机命名图 ...

  4. ios照片获取,拍照功能

    // //  HYBPhotoPickerManager.h //  ehui // //  Created by 黄仪标 on 14/11/26. //  Copyright (c) 2014年 黄 ...

  5. Android--启动拍照功能并返回结果

    因为没有深入学习拍照这块功能,所以只是简单的调用了一下系统的拍照功能,下面代码: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下s ...

  6. Cocos2d-x使用android拍照功能加载照片内存过大,通过另存照片尺寸大小解决

    使用2dx调用android拍照功能,拍照结束后在2dx界面显示拍照照片,如果不对照片做处理,会出现内存过大的问题,导致程序崩溃,如果仅仅另存拍照照片,则照片质量大小均下降,导致照片不够清晰,后来发现 ...

  7. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  8. Android使得手机拍照功能的发展(源共享)

    Android系统调用手机拍照功能有两种方法来直接调用手机自带摄像头还有一个就是要当心自己的节拍. 例Camera360 强大的一个在每个操作系统都有一个手机摄影软件:您可以捕捉不同风格,不同特效的照 ...

  9. 微信小程序(有始有终,全部代码)开发--- 新增模块: 图片选取以及拍照功能

    开篇语 前几天发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 后来又发了BUG修复的版本: 简年18: 微信小程序(有始有终,全部代码)开发 ...

随机推荐

  1. HDL之Bitwise operation

    1 Verilog 1.1 Bitwise operator Bitwise operators perform a bit wise operation on two operands. They ...

  2. php生成唯一识别码uuid

    /*生成唯一标志*标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx(8-4-4-4-12)*/ function uuid() { $chars = md ...

  3. VS2008中C++打开Excel(MFC)

    VS2008中C++打开Excel(MFC)——摘自网络,并加以细化 第一步:建立project(新建项目) 英文版 中文版 选择C++下的MFC Application(基于对话框的项目) 英文版 ...

  4. centos7 修改默认语言

    vi /etc/locale.conf # 修改成英文 LANG="en_US.UTF-8" # 修改成中文 LANG="zh_CN.UTF-8"

  5. VMware ESXi定制版(OEM ISO)资源下载(包含5.1\5.5\6.0)

     一.VMware ESXi 5.1.0 update03 1.VMware-ESXi-5.1.0-Update3-2323236-hitachi-0400.iso(日立) 2.VMware-ESXi ...

  6. flask_sqlalchemy和sqlalchemy联系区别及其使用方式

    ### 使用SQLAlchemy去连接数据库: 1.使用SQLALchemy去连接数据库,需要使用一些配置信息,然后将他们组合成满足条件的字符串:HOSTNAME = '127.0.0.1'PORT ...

  7. AMPL下载使用

    AMPL下载使用 依次执行以下操作 wget https://ampl.com/demo/amplide.linux64.tgz tar xzf amplide.linux64.tgz cd ampl ...

  8. Django 中Admin站点的配置

    Admin站点是django提供的一个后台管理页面,可以用来对用户与数据库表数据进行管理. Admin站点配置流程 1.在settings.py文件中INSTALL_APPS列表中添加django.c ...

  9. Hibernate之HQL基本用法

    关于HQL HQL与SQL非常类似,只不过SQL的操作对象是数据表,列等对象,而HQL操作的是持久化类,实例,属性等. HQL是完全面向对象的查询语言,因此也具有面向对象的继承,多态等特性. 使用HQ ...

  10. 02023_Arrays类的方法练习

    1.定义一个方法,接收一个数组,数组中存储10个学生考试分数,该方法要求返回考试分数最低的后三名考试分数. public static int[] method(double[] arr){ Arra ...