一、Surfaceview的使用

surfaceView的使用主要有三步:继承SurfaceView;获取SurfaceViewHolder;应用Holder更新展示内容。Surfaceview的应用有常用类型及数据展示的Demo。

拍照功能实现思路:

<span style="font-size:18px;">1,依据布局,获取Surfaceview对象;2,获取Holder对象并设置属性;3,绑定SurfaceHolder.Callback回调接口;4,回调接口的surfaceCreated方法中设置Camera并设置对应属性;5,设置拍照点击事件,在监听事件中绑定Camera.PictureCallback回调监听;6,PictureCallback监听中依据回调数据,进行结果保存。【保存照片并展示】</span>

二、实现拍照功能

  activity_take_pic.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><SurfaceViewandroid:id="@+id/surfaceView_2"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible" /><ImageViewandroid:id="@+id/pic_pre_view"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="gone" /><Buttonandroid:id="@+id/take_pic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|center_horizontal"android:background="@mipmap/camera_canon"android:text="拍照" /></FrameLayout>

TakePictureActivity.java主类实现:

public class TakePictureActivity extends Activity {/*** 图片预览及展示*/private SurfaceView surfaceView;/*** 拍照*/private Button takePic;/*** 图片展示*/private ImageView preViewPic;/*** 调用系统相机*/private Camera camera;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_take_pic);/*** 窗口布满全局*/getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);initView();initListener();}/*** 初始化View*/private void initView() {surfaceView = (SurfaceView) findViewById(R.id.surfaceView_2);takePic = (Button) findViewById(R.id.take_pic);preViewPic = (ImageView) findViewById(R.id.pic_pre_view);}/*** 初始化监听器*/private void initListener() {SurfaceHolder holder = surfaceView.getHolder();holder.setFixedSize(176, 155);holder.setKeepScreenOn(true);holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);holder.addCallback(new TakePictureSurfaceCallback());takePic.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (camera != null) {camera.takePicture(null, null, new TakePictureCallback());}}});}private final class TakePictureSurfaceCallback implements SurfaceHolder.Callback {@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {camera = Camera.open();if (camera == null) {int cametacount = Camera.getNumberOfCameras();camera = Camera.open(cametacount - 1);}Camera.Parameters params = camera.getParameters();params.setJpegQuality(80);//照片质量params.setPictureSize(1024, 768);//图片分辨率params.setPreviewFrameRate(5);//预览帧率camera.setDisplayOrientation(90);/*** 设置预显示*/
<span style="color:#FF0000;">//                camera.setPreviewDisplay(surfaceView.getHolder());camera.setPreviewDisplay(holder);</span>camera.setPreviewCallback(new Camera.PreviewCallback() {@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {}});/*** 开启预览*/camera.startPreview();} catch (Exception e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (camera != null) {camera.release();camera = null;}}}private final class TakePictureCallback implements Camera.PictureCallback {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {ByteArrayOutputStream os = new ByteArrayOutputStream(data.length);byte[] tempData = os.toByteArray();if (tempData != null && tempData.length > 0) {Bitmap bitmap = BitmapFactory.decodeByteArray(tempData, 0, tempData.length);preViewPic.setVisibility(View.VISIBLE);surfaceView.setVisibility(View.GONE);preViewPic.setImageBitmap(bitmap);}}}
}

展示效果:

三、细节注意

1,SurfaceHolder.Callback的surfaceCreated方法中,holder使用传参即可;

2,Camera在使用后必须camera.release();释放相机资源。

这里是源码

您也可以看看:Surfaceview的应用~_~

代码前行的路上还有些许枯燥,我愿意倾听您的声音,也希望您的帮助能更多的优化自己。我还没有爱上这个行业,我尽可能的保持一种好习惯,我相信能力增强的路上给我更多绚丽,一定会让我爱上这个行业的。现在的我只是及格,在及格边上徘徊。我处于迷茫中,暂时找不到出口 #_# ||     就多积累点。。。。。

“真正的勤奋,不是被迫的机械重复劳动,也不是自我感动式的摧残健康,更不是因为

拖延症导致的最后一刻效率爆发。它来自于一个人内心深处,对与那些无法获得即刻回

报的事情,依然能够保持十年如一的热情与专注。”

Surfaceview调用Camera实现拍照相关推荐

  1. android studio操作手机相机,Android Studio 调用Camera实现拍照功能

    首先创建一个SurfaceHolder实现对SurfaceView的回调,然后重写SurfaceCreate函数,实现对Camera的初始化等一系列工作:代码如下: @Override public ...

  2. 调用Camera API实现自己的拍照和摄像程序

    参考博客: http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 根据Camera API实现自己的拍照和摄像程序 通过上 ...

  3. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  4. Android多媒体功能开发(12)——使用Camera类拍照

    Android上用摄像头拍照.录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.came ...

  5. 通过Camera进行拍照

    Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity;import ja ...

  6. 14.3.1 调用系统的拍照功能

    14.3.1 调用系统的拍照功能 http://book.51cto.com  2010-06-22 14:19  李宁  中国水利水电出版社  我要评论(0) 摘要:<Android/OPho ...

  7. Python 微信机器人:调用电脑摄像头时时监控功能实现演示,调用电脑摄像头进行拍照并保存

    我想要做的就是用微信遥控电脑,电脑拍照后用微信进行接收.这样我就能时时监测到电脑摄像头范围内的景象了. 我们需要的是 VideoCapture 库,获取方式如下: lfd.uci.edu下载 然后直接 ...

  8. H5调用手机摄像头拍照,如何压缩后上传

    H5调用手机摄像头拍照后,怎样压缩再上传? 实际的压缩功能,就是利用canvas画布功能,将图片进行裁剪后保存图片的base64数据流,然后上传. 案例全部代码,示下: <!DOCTYPE ht ...

  9. JS调用本地摄像头拍照(兼容各大浏览器及IE8+)

    最近做的项目遇到了个难题,使用video+canvas+getUserMedia()写的调用本地摄像头拍照不兼容IE. 原因:IE8及以下不支持HTML5标签:video和canvas:IE11及以下 ...

最新文章

  1. php怎么将表格导出到excel表格,php怎么将excel表格数据-php 怎么把数据导出到excel表格...
  2. 算法竞赛入门第二版解题报告
  3. linux 查询替换文件内容吗,Linux 下查询文件的方法 替换文件内容
  4. 1880: wjw的火车站(栈)
  5. H5工程师跨页面取值的几种方法
  6. memcached安装及.NET中的Memcached.ClientLibrary使用详解
  7. 卖一头猪亏500元,“猪茅”也扛不住了?
  8. ubuntu终端Git中文乱码
  9. ubuntu 9 下 LAMP开发环境搭建
  10. Portal: 西电捷通TISec®技术
  11. [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机hash)
  12. 《通信技术 - 以太网》详解以太网(二)
  13. 音乐彩灯控制器C语言程序,基于单片机的LED彩灯控制器
  14. 基于php的企业公文流转审批系统
  15. mov转换成mp4,mov转mp4方法
  16. java最新全套学习视频(java,前端,其他语言)
  17. Android 状态栏背景颜色修改与状态栏字体颜色修改
  18. mysql允许连接表为空_mysql – 选择一个表中的所有项并与另一个表连接,允许空值...
  19. Vue3.0的新特性(8)Suspense
  20. 学术规范作业——心得体会

热门文章

  1. linux多线程_免费Linux下载工具,你还不知道?
  2. 关于销售订单高级定价的一点疑惑
  3. 记一次服务器被攻击后的经历
  4. 【SaaS考试认证】aPaaS_腾讯千帆神笔
  5. 短文本分类:电力95598工单分类实现
  6. 1118:铺地毯(C C++)
  7. 【建议收藏】2021年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂
  8. 【YBT2023寒假Day11 B】催眠大师(费用流)
  9. mybatis 不确定结果集集_集集丨与小直男的日常(三)
  10. 程序员写给老婆的代码