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. input[type=radio]选中的样式变化

    input[type=radio]:hover{ border: 2px solid #D0D0D0; } input[type=radio]:focus{ border: 2px solid #1B ...

  2. python编写简单的html登陆页面(1)

    1  html 打开调式效果如下 2  用python后台编写 # coding:utf-8# 从同一个位置导入多个工具,# 这些工具之间可以用逗号隔开,同时导入# render_template渲染 ...

  3. Editing a Book 搜索 + meet in the middle

    我们可以发现最多只会进行5次操作. 由此我们从双向跑dfs,用一个unordered_map来保存状态,枚举一下两边的深度即可. 如果4次仍然不可行,则只有可能是5次.所以正反最多只需要搜2层 cod ...

  4. npm run build 打包项目,图片等资源使用相对路径会出现路径错误的问题

    在build下的utils.js中,3使用 ‘vue-style-loader’ 依赖的地方添加 publicPath: '../../' , 如图:

  5. CF787A - The Monster

    /* CF787A - The Monster http://codeforces.com/contest/787/problem/A 数学 扩展欧几里得 注意x或y为0的时候要特判 并且结果要大于b ...

  6. Java开源框架 iBase4J 搭建笔记

    项目地址:https://gitee.com/iBase4J/iBase4J 搭建步骤:     1.git 代码     2.安装 Zookeeper     3.打包部署 Dubbo Admin ...

  7. mybatis逆向工程不生成Example

    mybatis逆向生成映射文件时会生成一大堆example文件,没感觉有啥用,可以手动删除这些多余的东西,使项目变得好看许多 也可以通过配置达到目的: 原配置: <table tableName ...

  8. C#中的IEnumerable<T>知识点

    1.扩展IEnumerable<T>的方法 使继承了IEnumeralbe<T>的接口有了MyS方法 static class MySum {                  ...

  9. SQL-Oracle-创建Dblink

    create database link DBLINK_IMARK_RAC connect to imark identified by imarkDB12345 using '(DESCRIPTIO ...

  10. SSAO + FXAA

    如今已经完毕了渲染器的屏幕空间环境光遮挡(SSAO)算法和FXAA高速反走样算法,等有时间就把当中的相关原理和当中遇到的问题进行总结发表.