一切源于在项目过程中的一个Bug:我的需求是在MainActivity 实现自动预览,也可以点击跳到签到SignedActivity去实现拍照签到,第一次进入界面的时候都是正常的,但是有时候返回来的时候预览失败,即从MainActivity跳转到SignedActivity偶尔预览失败和从SignedActivity返回MainActivity偶尔失败,都是报(CAMERA_IN_USE)ERRO=1的错误,奇怪的是的的确确做了完全释放操作,加上以前用的更多的是Camera api 对于Camer2 的机制没有完整去研究过,一下子懵了,于是乎先去找了Stack Overflow,查到一个解决方案是:"我弃用了新API,换回旧API",ORZ,找了其他的也没有答案,可是我不服呀,我就把官方的文档全部啃了一遍,于是乎便有了以下的理解,我想如果你不懂得怎么使用Camera2的话,这篇绝对值得你去阅读,你会发现Camera2 并非像大多数说得那样使用起来很复杂。
成都创新互联的客户来自各行各业,为了共同目标,我们在工作上密切配合,从创业型小企业到企事业单位,感谢他们对我们的要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。专业领域包括成都网站制作、成都网站设计、电商网站开发、微信营销、系统平台开发。
全新的android.hardware.Camera2 。Android 5.0对拍照API进行了全新的设计,新增了全新设计的Camera 2 API,这些API不仅大幅提高了Android系统拍照的功能,还能支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等。
在Camera2 架构在核心参与类角色有: CameraManager 、 CameraDevice 、 CameraCharacteristics 、 CameraRequest与CameraRequest.Builder 、 CameraCaptureSession 以及 CaptureResult 。
位于android.hardware.camera2.CameraManager下,也是Android 21(5.0)添加的,和其他系统服务一样通过 Context.getSystemService(CameraManager.class ) 或者 Context.getSystemService(Context.CAMERA_SERVICE) 来完成初始化,主要用于管理系统摄像头:
CameraDevice是Camera2中抽象出来的一个对象,直接与系统硬件摄像头相联系。因为不可能所有的摄像头都会支持高级功能(即摄像头功能可被分为limit 和full 两个级别),当摄像头处于limited 级别时候,此时Camera2和早期的Camera功能差不多,除此之外在Camera2架构中,CameraDevice还承担其他两项重要任务:
正如前面所说, 系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata,这一切都是在由对应的CameraDevice创建的CameraCaptureSession 会话完成 ,当程序需要预览、拍照、再次预览时,都需要先通过会话。(A configured capture session for a CameraDevice , used for capturing images from the camera or reprocessing images captured from the camera in the same session previously.A CameraCaptureSession is created by providing a set of target output surfaces to createCaptureSession , or by providing an InputConfiguration and a set of target output surfaces to createReprocessableCaptureSession for a reprocessable capture session . Once created, the session is active until a new session is created by the camera device, or the camera device is closed.)CameraCaptureSession一旦被创建,直到对应的CameraDevice关闭才会死掉。虽然CameraCaptureSession会话用于从摄像头中捕获图像,但是只有同一个会话才能再次从同一摄像头中捕获图像。另外, 创建会话是一项耗时的异步操作,可能需要几百毫秒 ,因为它需要配置相机设备的内部管道并分配内存缓冲区以将图像发送到所需的目标,因而createCaptureSession和createReprocessableCaptureSession会将随时可用的CameraCaptureSession发送到提供的监听器的onConfigured回调中。如果 无法完成配置,则触发onConfigureFailed回调 ,并且会话将不会变为活动状态。最后需要注意的是,如果 摄像头设备创建了一个新的会话,那么上一个会话是被关闭的,并且会回调与其关联的onClosed ,如果不处理好,当会话关闭之后再次调用会话的对应方法那么所有方法将会跑出IllegalStateException异常。关闭的会话清除任何重复的请求(和调用了stopRepeating()方法类似),但是在新创建的会话接管并重新配置摄像机设备之前,关闭的会话仍然会正常完成所有正在进行的捕获请求。简而言之,在Camera2中CameraCaptureSession承担很重要的角色:
描述Cameradevice属性的对象,可以使用CameraManager通过getCameraCharacteristics(String cameraId)进行查询。
CameraRequest代表了一次捕获请求, 而CameraRequest.Builder用于描述捕获图片的各种参数设置,包含捕获硬件(传感器,镜头,闪存),对焦模式、曝光模式,处理流水线,控制算法和输出缓冲区的配置。 ,然后传递到对应的会话中进行设置, CameraRequest.Builder则负责生成CameraRequest对象 。当程序调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。CameraRequest可以通过CameraRequest.Builder来进行初始化,通过调用createCaptureRequest来获得。
CaptureRequest描述是从图像传感器捕获单个图像的结果的子集的对象。(CaptureResults are produced by a CameraDevice after processing a CaptureRequest)当CaptureRequest被处理之后由CameraDevice生成。
CameraManager 处于顶层管理位置负责 检测获取所有摄像头及其特性 和 传入指定的CameraDevice.StateCallback回调打开指定摄像头 , CameraDevice 是负责管理抽象对象,包括 监听Camera 的状态回调CameraDevice.StateCallback 、 创建CameraCaptureSession和CameraRequest , CameraCaptureSession 用于描述一次图像捕获操作,主要负责 监听自己会话的状态回调CameraCaptureSession.StateCallback 和 CameraCaptureSession.CaptureCallback捕获回调 ,还有 发送处理CameraRequest ; CameraRequest 则可以看成是一个"JavaBean"的作用用于描述希望什么样的配置来处理这次请求;最后三个回调用于监听对应的状态。
CameraManager 处于顶层管理位置负责检测 检测获取所有摄像头并设置输出参数,传入指定的CameraDevice.StateCallback回调,然后打开指定摄像头,并触发CameraDevice.StateCallback中的onOpened方法,并在onOpened方法里开始通过调用创建预览会话, ,CameraDevice负责创建请求 CameraCharacteristics 、 CameraRequest与CameraRequest.Builder 、 CameraCaptureSession 以及 CaptureResult 则可以看成是一个JavaBean的作用用于描述以什么样的配置来处理这次请求。
Camera2Helper类只是简单的封装了下,为了让Camera2的初始化和Activity 高度分离,这个类只是Demo 阶段部分有待优化,另外结合我具体的业务,对于图片大小有限制,所以我都是默认采用采样压缩率方式对图片进行压缩
说的是刚刚起步学习的同学,假如开始没有任何的开发经验的话,千万不要着急,不要想着在短时间内就把一个语言学习好,因为你之前没有任何的学习经验,在这个过程中需要有耐心地学习完JAVA的基础知识,然后才开始踏上Android开发之旅。一类同学是只之前做过JAVA开发经验的,这类同学可以在Android上迅速上手,但是同样的是不可忽略Android的一些基础知识,只有把基础掌握好了,才能在后期取得大的进步。 二、Android基础知识学习 在掌握好JAVA基础知识后,接下来就是学习Android基础知识和如何查看开发文档了,在这个阶段我认为是学习最有劲头和最有收获的时候,因为从一无所知到了解是会让人有收获良多的感觉,事实上在这一阶段也是学习了很多,至少知道如何建立工程,知道一些基本的机制很常用函数的用法,这个阶段会出现很多的问题,往往一个很低级的问题都会把你难倒,而这阶段正式培养学习能力的好时机,还是那句话,凡是遇到问题第一个想的是自己去解决,自己解决不了的,用百度用谷歌,要学会使用搜索引擎,大部分的时候问题都能得到解决,因为你遇到过的问题别人早就遇到过了,假如搜索引擎也找不到好的答案,这时候可以到论坛发帖问,网上牛人很多,也可以选择到群里咨询。 三、Android开发进阶 学习完Android基础知识以后,很多同学很快就会感觉到学习停步不前,感觉自己似懂非懂,我觉得这个时候是学习最关键的时候,因为一旦你踏出这一步之后,你对Android的理解就会跟更加透彻,做起开发也会更加有信心,但是怎样跨过这一阶段,我根据自己的经验是首先是保持对自己的信心,自己找一个比较简单的项目做做或者找一些应用的源代码研究研究,然后自己山寨出来一个,这样你也会有了学习的方向,因为你在了解了基础知识以后急切需要证明一下自己到底是学到了什么东西,而开发出一个自己的简单应用,就是最大的证明了,而且在开发应用的时候,肯定会遇到很多的问题,而在独立解决bug的同时,你已经掌握了独立处理问题的能力。
希望能解决您的问题。
小明首先需要购买一本Android入门的书籍,为了更快地学习Android,小明业余时间也都用来一边看书一边照着书中的例子敲代码,结果2周时间小明就把这本书学了一遍。看完这本书后,小明对Android的历史、结构、代码规范等都有了一个大概的了解,并且,小明已经可以写出一些简单的Activity了。这个时候在小明眼里,Android开发很简单很好玩,通过在xml中摆放一些按钮文本框什么的就可以做一些界面了。
小明开始跟着他的技术导师做需求,一些简单的小需求小明自然是不在话下了。突然有一天来了一个需求,该需求要求小明在Activity中为一个button加一个动画效果,小明慌了:“完全没接触过,书上也没有讲,怎么办呢?”小明冷静了下,打开了百度搜索,输入“Android 动画”,打开前几个链接,小明恍然大悟,照着网上的例子把需求给实现了。后来导师告诉他:“学好Android,官方文档是必须看的,既全面又权威”。然后小明如获至宝,花了一年时间把上面的guide和training都看了一遍,并且他还动手抄了几个小例子。
有一天,小明又需要做一个动画相关的需求,这可难不倒小明,它熟练地打开了,输入“Android 动画”,突然他楞了一下:”总不能每次写动画都要百度一下吧!“,于是他在CSDN开了一个博客,把动画相关的知识点都写上去,为的是后面再写动画相关的代码就不用百度去搜了,事实如何呢?后面再写动画相关的代码,小明的确不用再去百度搜了,因为通过写一篇动画博客,他把动画相关的细节都已经记住了,这样他就可以不用再去参考任何文档了,后来小明还学会了把一些琐碎的不方便放在博客上的东西写到了印象笔记上面,什么时候忘了10秒钟以内都可以快速找回来,而不是花10分钟去再次搜索一遍。
这里总结一下,Android入门的时候,需要有一本入门书,好好学习书中的内容,同时花一年时间把Android官方文档中的training和guide看一遍,同时通过写博客和记笔记的方式来做总结,建议让自己的每篇博客都有价值些。通过一年时间的学习,相信每个人都可以达到中级工程师的水平。
技术要求:
- 基本知识点
比如四大组件如何使用、如何创建Service、如何进行布局、简单的自定义View、动画等常见技术
- 书籍推荐
《第一行代码 Android》、《疯狂Android》
中级工程师
小明经过一年的努力学习终于成为Android中级工程师了,月薪变成了17k。到了中级工程师,已经可以在公司里干很多体力活了,但是一些很重要的任务小明还不能一个人承担起来,这个时候小明需要学习的内容就很多了,如下所示:
- AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的区别;
- Binder:从Java层大概理解Binder的工作原理,懂Parcel对象的使用;
- 多进程:熟练掌握多进程的运行机制,懂Messenger、Socket等;
- 事件分发:弹性滑动、滑动冲突等;
- 玩转View:View的绘制原理、各种自定义View;
- 动画系列:熟悉View动画和属性动画的不同点,懂属性动画的工作原理;
- 懂性能优化、熟悉mat等工具
- 懂点常见的设计模式
学习方法
阅读进阶书籍,阅读Android源码,阅读官方文档并尝试自己写相关的技术文章,需要有一定技术深度和自我思考。在这个阶段的学习过程中,有2个点是比较困扰大家的,一个是阅读源码,另一个是自定义View以及滑动冲突。
如何阅读源码呢?这是个头疼的问题,但是源码必须要读。阅读源码的时候不要深入代码细节不可自拔,要关注代码的流程并尽量挖掘出对应用层开发有用的结论。另外仔细阅读源码中对一个类或者方法的注释,在看不懂源码时,源码中的注释可以帮你更好地了解源码中的工作原理,这个过程虽然艰苦,但是别无他法。
如何玩转自定义View呢?我的建议是不要通过学习自定义view而学习自定义view。为什么这么说呢?因为自定义view的种类太多了,各式各样的绚丽的自定义效果,如何学的玩呢!我们要透过现象看本质,更多地去关注自定义view所需的知识点,这里做如下总结:
- 搞懂view的滑动原理
- 搞懂如何实现弹性滑动
- 搞懂view的滑动冲突
- 搞懂view的measure、layout和draw
- 然后再学习几个已有的自定义view的例子
- 最后就可以搞定自定义view了,所谓万变不离其宗
大概再需要1-2年时间,即可达到高级工程师的技术水平。我个人认为通过《Android开发艺术探索》和《Android群英传》可以缩短这个过程为0.5-1年。注意,达到高级工程师的技术水平不代表就可以立刻成为高级工程师(受机遇、是否跳槽的影响),但是技术达到了,成为高级工程师只是很简单的事。
技术要求:
- 稍微深入的知识点
AIDL、Messenger、Binder、多进程、动画、滑动冲突、自定义View、消息队列等
- 书籍推荐
《Android开发艺术探索》、《Android群英传》
高级工程师
小明成为了梦寐以求的高级工程师,月薪达到了20k,还拿到了一丢丢股票。这个时候小明的Android水平已经不错了,但是小明的目标是资深工程师,小明听说资深工程师月薪可以达到30k+。
为了成为Android资深工程师,需要学习的东西就更多了,并且有些并不是那么具体了,如下所示:
- 继续加深理解”稍微深入的知识点“中所定义的内容
- 了解系统核心机制:
1. 了解SystemServer的启动过程
2. 了解主线程的消息循环模型
3. 了解AMS和PMS的工作原理
4. 能够回答问题”一个应用存在多少个Window?“
5. 了解四大组件的大概工作流程
6. …
- 基本知识点的细节
1. Activity的启动模式以及异常情况下不同Activity的表现
2. Service的onBind和onReBind的关联
3. onServiceDisconnected(ComponentName className)和binderDied()的区别
4. AsyncTask在不同版本上的表现细节
5. 线程池的细节和参数配置
6. …
- 熟悉设计模式,有架构意识
学习方法
这个时候已经没有太具体的学习方法了,无非就是看书、看源码和做项目,平时多种总结,尽量将知识融会贯通从而形成一种体系化的感觉。同时这个阶段对架构是有一定要求的,架构是抽象的,但是设计模式是具体的,所以一定要加强下设计模式的学习。关于设计模式的学习,最近一本新书推荐给大家《Android 源码设计模式解析与实战》,既可以学习设计模式,又可能体会到Android源码中的设计思想,我最近也在阅读此书。
技术要求:
- 稍微深入的知识点
- 系统核心机制
- 基本知识点的细节
- 设计模式和架构
- 书籍推荐
《Android开发艺术探索》、《Android 源码设计模式解析与实战》、《Android内核剖析》
资深工程师
这个阶段的程序员也许并没有太具体的学习路线了。
Android高级进阶,职业发展规划
腾讯课堂,动脑学院VIP
全部mp4格式,没有加密,可在线观看
加q:399759094
安卓开发需要学:
一、应用程序
Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个 Activity 类负责创建视窗,一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。
二、中介软件
操作系统与应用程序的沟通桥梁,并用分为两层:函数层(Library)和虚拟机(Virtual Machine)。 Bionic是 Android 改良libc的版本。
Android 同时包含了Webkit,所谓的Webkit 就是Apple Safari浏览器背后的引擎。Surface flinger 是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的Bionic Libc。
三、硬件抽像层
Android 的 HAL(硬件抽像层)是能以封闭源码形式提供硬件驱动模块。HAL
的目的是为了把 Android framework 与 Linux kernel 隔开。
让 Android 不至过度依赖 Linux
kernel,以达成 kernel independent 的概念,也让 Android framework
的开发能在不考量驱动程序实现的前提下进行发展。
四、编程语言
Android 是运行于 Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持。
包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。
五、安全控制
目前Android 的 Linux kernel控制包括安全(Security),存储器管理(Memory Managemeat),程序管理(Process Management),网络堆栈(Network Stack),驱动程序模型等。
下载Android源码之前,先要安装其构建工具Repo来初始化源码。Repo 是 Android 用来辅助Git工作的一个工具。
参考资料来源:百度百科—android开发
《Android开发进阶》(何红辉)电子书网盘下载免费在线阅读
资源链接:
链接:
提取码: 0q3x
书名:Android开发进阶
作者:何红辉
豆瓣评分:6.0
出版社:人民邮电出版社
出版年份:2016-2-1
页数:378
内容简介:
本书是一本专门介绍Android开发的图书。书中首先对Android开发的核心知识点进行深入讲解,然后介绍单元测试、代码规范、版本控制、重构、架构等重要的知识,使得读者在深入掌握技术的同时也帮助他们开阔眼界,且能够以更专业的方式设计应用软件,完成从只会实现功能的初级程序员到软件工程师、设计师的转变。
本书的主要内容为:构成Android系统基石的四大组件、创造出丰富多彩的UI设计的控件、保证App流畅的多线程开发、必知必会的HTTP网络请求应用、数据存储的核心SQLite数据库、让程序的性能优化、让程序更整洁的代码规范、管理程序的好帮手Git版本控制,以及需要掌握的高级技术,如单元测试、六大原则与设计模式、重构和综合实战等。
本书适合Android开发初学者、程序员学习,也适合作为大中专院校相关专业的师生用书和培训学校的教材。
作者简介:
何红辉 : 前友盟(阿里巴巴集团)Android工程师,CSDN博客专家,活跃于国内各大技术社区,热爱开源,热爱技术,热爱分享。Android事件总线开源库(AndroidEventBus)、Colorful作者,开发技术前线站长。