Android官方开发文档Training系列课程中文版:调用相机之控制相机

原文地址:http://android.xsoftlab.net/training/camera/cameradirect.html

在这节课,我们会讨论如何使用Android框架API来直接控制相机硬件。

直接控制设备的相机拍照或者摄像的代码远比通过其他相机应用来完成要多得多。然而,如果你想构建一个专业的相机应用或者在APP的UI中完全集成相机的话,这节课展示了如何去做。

开启相机对象

直接控制相机的第一步就是获得Camera对象的实例。和Android自身的相机应用相同,推荐访问相机的方式就是在独立的线程打开Camera,这种方式是应对阻塞UI线程的一个好的解决方法。在更加基础化的实现当中,开启相机这一步操作可以推迟到onResume()方法中执行,这样可以促使代码重用并且保持简单的控制流。

如果相机已经正在被其它应用所使用,那么调用Camera.open()方法会抛出一个异常,所以我们需要使用try控制块包裹住它:

private boolean safeCameraOpen(int id) {boolean qOpened = false;try {releaseCameraAndPreview();mCamera = Camera.open(id);qOpened = (mCamera != null);} catch (Exception e) {Log.e(getString(R.string.app_name), "failed to open Camera");e.printStackTrace();}return qOpened;    
}
private void releaseCameraAndPreview() {mPreview.setCamera(null);if (mCamera != null) {mCamera.release();mCamera = null;}
}

从API 9开始,相机框架支持多个相机。如果你使用的是过去的API,然后调用了没有参数的open()方法,那么你会获得后置面板的相机。

创建相机预览

拍照通常需要可以使用户能看到目标的预览图。你可以使用SurfaceView来绘制相机传感器捕获到的图像。

预览类

为了可以显示预览,你需要预览类。预览需要一个android.view.SurfaceHolder.Callback接口的实现,它被用来从相机硬件给应用传递图像数据。

class Preview extends ViewGroup implements SurfaceHolder.Callback {SurfaceView mSurfaceView;SurfaceHolder mHolder;Preview(Context context) {super(context);mSurfaceView = new SurfaceView(context);addView(mSurfaceView);// Install a SurfaceHolder.Callback so we get notified when the// underlying surface is created and destroyed.mHolder = mSurfaceView.getHolder();mHolder.addCallback(this);mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}
...
}

在开始预览之前,必须将预览对象传递给Camera对象,就像下面部分展示的那样。

设置并开始预览

相机实例的创建于相关预览对象创建必须是以指定顺序进行的,从相机对象开始。在下面的代码中,实例化相机对象的过程被封装起来了,所以Camera.startPreview()是可以通过setCamera()调用的,每当用户做了什么事情使相机发生了改变。预览也必须在预览类的surfaceChanged()回调方法重新启动。

public void setCamera(Camera camera) {if (mCamera == camera) { return; }stopPreviewAndFreeCamera();mCamera = camera;if (mCamera != null) {List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();mSupportedPreviewSizes = localSizes;requestLayout();try {mCamera.setPreviewDisplay(mHolder);} catch (IOException e) {e.printStackTrace();}// Important: Call startPreview() to start updating the preview// surface. Preview must be started before you can take a picture.mCamera.startPreview();}
}

修改相机设置

相机设置可以改变相机拍照的方式,从缩放等级到曝光补偿等等。下面的示例只是更改了预览的大小;请查看相机应用的源代码获取更多可能。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {// Now that the size is known, set up the camera parameters and begin// the preview.Camera.Parameters parameters = mCamera.getParameters();parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);requestLayout();mCamera.setParameters(parameters);// Important: Call startPreview() to start updating the preview surface.// Preview must be started before you can take a picture.mCamera.startPreview();
}

设置预览方向

大多数的相机应用将展示锁定在了水平方向,因为这是相机传感器的自然方向。这个设置并不能阻止你在垂直方向上拍摄,因为相机的方向会被记录到EXIF的头部。setCameraDisplayOrientation()方法允许你改变如何展示预览,而不受图像记录方向的影响。然而,在API14之前,在改变方向之前必须停止预览,然后在重新启动它。

拍照

一旦预览启动后,可以使用Camera.takePicture()方法来拍一张照片。你可以创建Camera.PictureCallback对象和Camera.ShutterCallback对象然后将它们传递给Camera.takePicture()方法。

重启预览

在拍了一张照片之后,你必须在用户拍另一张照片之前重新启动预览。在这个例子中,通过重写快门按钮来完成重启。

@Override
public void onClick(View v) {switch(mPreviewState) {case K_STATE_FROZEN:mCamera.startPreview();mPreviewState = K_STATE_PREVIEW;break;default:mCamera.takePicture( null, rawCallback, null);mPreviewState = K_STATE_BUSY;} // switchshutterBtnConfig();
}

停止预览并且释放相机

一旦你的程序不再需要使用相机,这时就需要执行清理工作。尤其是你需要释放相机对象,否则会使其它程序面临崩溃的风险,包括你自己程序中新的实例。

何时应该停止预览并释放相机呢?好吧,当预览界面被销毁的时候便是停止预览并释放相机的最佳时机,就像下面Preview类中显示的那样:

public void surfaceDestroyed(SurfaceHolder holder) {// Surface will be destroyed when we return, so stop the preview.if (mCamera != null) {// Call stopPreview() to stop updating the preview surface.mCamera.stopPreview();}
}
/*** When this function returns, mCamera will be null.*/
private void stopPreviewAndFreeCamera() {if (mCamera != null) {// Call stopPreview() to stop updating the preview surface.mCamera.stopPreview();// Important: Call release() to release the camera for use by other// applications. Applications should release the camera immediately// during onPause() and re-open() it during onResume()).mCamera.release();mCamera = null;}
}

在上面的课程中,这段程序也是setCamera()方法的一部分,所以实例化一个相机总是从停止这段预览开始的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我,大学没毕业,在OpenAI搞AI,想教教你如何提升“研究品味”

文 | 蒋宝尚源 | AI科技评论在AI圈里有这么一个人&#xff0c;虽然大学没有毕业&#xff0c;但却做过谷歌大脑研究员&#xff0c;担任过OpenAI团队的领导人。他被人称作“怪胎”&#xff0c;也被人称作神童。他的名字叫做Chris Olah。在众人眼里&#xff0c;他的成长树在一开始…

LeetCode 889. 已知前序后序 求二叉树(不唯一)

1. 题目 返回与给定的前序和后序遍历匹配的任何二叉树。 pre 和 post 遍历中的值是不同的正整数。 示例&#xff1a;输入&#xff1a;pre [1,2,4,5,3,6,7], post [4,5,2,6,7,3,1] 输出&#xff1a;[1,2,3,4,5,6,7]来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链…

cuda run out of memory内存不足的解决方案

https://segmentfault.com/a/1190000022589080

论文浅尝 | TANDA: Transfer and Adapt Pre-Trained Transformer Models

论文笔记整理&#xff1a;王春培&#xff0c;天津大学硕士。链接&#xff1a;https://arxiv.org/pdf/1911.04118.pdf动机这篇文章聚焦的是问答系统&#xff08;Q&A&#xff09;中的一个问题&#xff1a;回答句子选择&#xff08;Answer Sentence Selection&#xff0c;AS2&…

深入浅出排序学习:写给程序员的算法系统开发实践

引言 我们正处在一个知识爆炸的时代&#xff0c;伴随着信息量的剧增和人工智能的蓬勃发展&#xff0c;互联网公司越发具有强烈的个性化、智能化信息展示的需求。而信息展示个性化的典型应用主要包括搜索列表、推荐列表、广告展示等等。 很多人不知道的是&#xff0c;看似简单的…

从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决办法

本篇文章假设读者没有任何的触摸事件基础知识&#xff0c;所以我们会从最基本的触摸事件分发处说起。 ScrollView为什么会出现嵌套EditText出现滑动事件冲突呢&#xff1f;相信你会有这种疑问&#xff0c;我们来看这么一种情况&#xff1a; 有一个固定高度的EditText&#xff…

LeetCode 1185. 一周中的第几天

1. 题目 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天。 输入为三个整数&#xff1a;day、month 和 year&#xff0c;分别表示日、月、年。 您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursda…

使用NLP和ML来提取和构造Web数据

原文链接&#xff1a;https://blog.csdn.net/fendouaini/article/details/109374462 作者|Conner Brew 编译|VK 来源|Towards Data Science 介绍 在本文中&#xff0c;我们将创建一个基于战争研究所&#xff08;ISW&#xff09;的结构化文档数据库。ISW为外交和情报专业人员提供…

如何评价一个推荐系统的好坏?

文 | Nemo知乎本文已获作者授权&#xff0c;禁止二次转载现如今&#xff0c;推荐系统几乎无处不在。电商购物&#xff0c;有猜你喜欢。资讯阅读&#xff0c;有个性推荐。听歌看电影&#xff0c;都能识别你的兴趣。就连工作社交&#xff0c;也会提示你可能认识的人...推荐系统火…

论文浅尝 | GEOM-GCN: Geometric Graph Convolutional Networks

论文笔记整理&#xff1a;毕祯&#xff0c;浙江大学硕士&#xff0c;研究方向&#xff1a;知识图谱、自然语言处理。动机消息传递神经网络&#xff08;MPNN&#xff09;已成功应用于现实世界中的各种应用中。但是MPNN聚合器的两个基本弱点限制了它们表示图结构数据的能力&#…

ScrollView嵌套EditText联带滑动的解决办法

本篇文章的相关内容需结合上文&#xff1a;从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决办法 在说完了如何解决ScrollView嵌套EditText的滑动事件冲突之后&#xff0c;我们接下来说一下如何实现它们两者之间的联带滑动。什…

数据库智能运维探索与实践

从自动化到智能化运维过渡时&#xff0c;美团DBA团队进行了哪些思考、探索与实践&#xff1f;本文根据赵应钢在“第九届中国数据库技术大会”上的演讲内容整理而成&#xff0c;部分内容有更新。 背景 近些年&#xff0c;传统的数据库运维方式已经越来越难于满足业务方对数据库的…

Github上有趣的100个python项

Github上有趣的100个python项目

论文浅尝 | PAKDD2020 - 利用支持集中匹配信息的 few shot 事件分类方法

论文笔记整理&#xff1a;申时荣&#xff0c;东南大学博士生。来源&#xff1a;PAKDD 2020链接&#xff1a;https://arxiv.xilesou.top/pdf/2002.05295.pdf1.介绍&#xff1a;事件分类是一个重要的信息抽取任务&#xff0c;其目的是根据事件的提及实例对事件类别进行分类。目前…

梯度下降法的神经网络容易收敛到局部最优,为什么应用广泛?

文 | Summer Clover知乎本文已获作者授权&#xff0c;禁止二次转载这是Deep Learning Theory里很基本也很核心的一个问题。在这个问题上&#xff0c;初学者容易被入门教学误导&#xff0c;非此研究方向的业内人士也容易有过时的认知。首先问题描述不够准确。更准确的说法是&…

Android官方开发文档Training系列课程中文版:打印内容之图像打印

原文地址&#xff1a;http://android.xsoftlab.net/training/printing/index.html 引言 Android用户会很频繁的浏览设备上的内容&#xff0c;但是有部分情况例外&#xff0c;当屏幕没有足够的方式可以分享信息的时候。那么可以打印Android应用上的内容便给用户提供了一种方式…

机器学习在美团配送系统的实践:用技术还原真实世界

在2018 AI开发者大会&#xff08;AI NEXTCon&#xff09;上&#xff0c;美团配送AI方向负责人何仁清&#xff0c;分享了美团在即时配送领域中机器学习技术的最新进展&#xff0c;以及如何通过大数据和机器学习手段&#xff0c;建立对线下真实世界各种场景的感知能力&#xff0c…

机器学习算法应用场景实例六十则

原文链接&#xff1a;https://blog.csdn.net/liulingyuan6/article/details/53648273本文整理了60个机器学习算法应用场景实例&#xff0c;含分类算法应用场景20个、回归算法应用场景20个、聚类算法应用场景10个以及关联规则应用场景10个。包含了天池、DataCastle、DataFountai…

LeetCode 99. 恢复二叉搜索树(中序遍历)

1. 题目 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下&#xff0c;恢复这棵树。 你能想出一个只使用常数空间的解决方案吗&#xff1f; 2. 解题 循环中序遍历&#xff08;栈&#xff09;&#xff0c;记录不满足的节点&#xff0c;交换其valO(n)O(n)O(n)…

Android官方开发文档Training系列课程中文版:打印内容之HTML文档打印

原文地址&#xff1a;http://android.xsoftlab.net/training/printing/html-docs.html 在Android中打印内容要比打印照片要复杂一些&#xff0c;它要求将文本与图像整合到一个文档中。不过Android框架提供了一种实现方式&#xff0c;这种方式需要使用HTML来整合文档并打印&…