Surfaceview调用Camera实现拍照
一、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实现拍照相关推荐
- android studio操作手机相机,Android Studio 调用Camera实现拍照功能
首先创建一个SurfaceHolder实现对SurfaceView的回调,然后重写SurfaceCreate函数,实现对Camera的初始化等一系列工作:代码如下: @Override public ...
- 调用Camera API实现自己的拍照和摄像程序
参考博客: http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 根据Camera API实现自己的拍照和摄像程序 通过上 ...
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...
- Android多媒体功能开发(12)——使用Camera类拍照
Android上用摄像头拍照.录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.came ...
- 通过Camera进行拍照
Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity;import ja ...
- 14.3.1 调用系统的拍照功能
14.3.1 调用系统的拍照功能 http://book.51cto.com 2010-06-22 14:19 李宁 中国水利水电出版社 我要评论(0) 摘要:<Android/OPho ...
- Python 微信机器人:调用电脑摄像头时时监控功能实现演示,调用电脑摄像头进行拍照并保存
我想要做的就是用微信遥控电脑,电脑拍照后用微信进行接收.这样我就能时时监测到电脑摄像头范围内的景象了. 我们需要的是 VideoCapture 库,获取方式如下: lfd.uci.edu下载 然后直接 ...
- H5调用手机摄像头拍照,如何压缩后上传
H5调用手机摄像头拍照后,怎样压缩再上传? 实际的压缩功能,就是利用canvas画布功能,将图片进行裁剪后保存图片的base64数据流,然后上传. 案例全部代码,示下: <!DOCTYPE ht ...
- JS调用本地摄像头拍照(兼容各大浏览器及IE8+)
最近做的项目遇到了个难题,使用video+canvas+getUserMedia()写的调用本地摄像头拍照不兼容IE. 原因:IE8及以下不支持HTML5标签:video和canvas:IE11及以下 ...
最新文章
- php怎么将表格导出到excel表格,php怎么将excel表格数据-php 怎么把数据导出到excel表格...
- 算法竞赛入门第二版解题报告
- linux 查询替换文件内容吗,Linux 下查询文件的方法 替换文件内容
- 1880: wjw的火车站(栈)
- H5工程师跨页面取值的几种方法
- memcached安装及.NET中的Memcached.ClientLibrary使用详解
- 卖一头猪亏500元,“猪茅”也扛不住了?
- ubuntu终端Git中文乱码
- ubuntu 9 下 LAMP开发环境搭建
- Portal: 西电捷通TISec®技术
- [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机hash)
- 《通信技术 - 以太网》详解以太网(二)
- 音乐彩灯控制器C语言程序,基于单片机的LED彩灯控制器
- 基于php的企业公文流转审批系统
- mov转换成mp4,mov转mp4方法
- java最新全套学习视频(java,前端,其他语言)
- Android 状态栏背景颜色修改与状态栏字体颜色修改
- mysql允许连接表为空_mysql – 选择一个表中的所有项并与另一个表连接,允许空值...
- Vue3.0的新特性(8)Suspense
- 学术规范作业——心得体会