Ⅰ 什么是原生安卓
原生android系统是指Google公司发布,没有经过第三方修改的安卓系统。是最正宗的Android,它的基础功能设计非常简单,所以使用起来的流畅度很好。
有生产厂商在Android系统上加上了自家定制的内容,增强个性化,修改了部分界面,添加了某些插件和应用程序等,就不能称为原生Android系统。
Ⅱ Android原生编解码接口 MediaCodec 之——完全解析
MediaCodec 是Android 4.1(api 16)版本引入的编解码接口, Developer 官网 上描述的已经很清楚了。可以配合 中文翻译 一起看。理解更深刻。
MediaCodec的工作流程:
从上图可以看出 MediaCodec 架构上采用了2个缓冲区队列,异步处理数据,并且使用了一组输入输出缓存。
你请求或接收到一个空的输入缓存(input buffer),向其中填充满数据并将它传递给编解码器处理。编解码器处理完这些数据并将处理结果输出至一个空的输出缓存(output buffer)中。最终,你请求或接收到一个填充了结果数据的输出缓存(output buffer),使用完其中的数据,并将其释放给编解码器再次使用。
具体工作如下:
MediaCodec的基本调用流程是:
1.初始化MediaCodec,方法有两种,分别是通过名称和类型来创建,对应的方法为:
2.配置编码器,设置各种编码器参数(MediaFormat),这个类包含了比特率、帧率、关键帧间隔时间等。然后再调用 mMediaCodec .configure,对于 API 19 以上的系统,我们可以选择 Surface 输入:mMediaCodec .createInputSurface,
3.打开编码器,获取输入输出缓冲区
获取输入输出缓冲区在api19 上是以上方式获取,api21以后 可以使用直接获取ByteBuffer
4.输入数据,有2种方式,一种是普通输入,一种是Surface 输入
普通输入又可区分为两种情况,一种是配合MediaExtractor ,一种是取原数据;
返回一个填充了有效数据的input buffer的索引,如果没有可用的buffer则返回-1,参数为超时时间(TIMES_OUT),单位是微秒,当timeoutUs==0时,该方法立即返回;当timeoutUs<0时,无限期地等待一个可用的input buffer,当timeoutUs>0时,
等待时间为传入的微秒值。
上面输入缓存的index,通过getInputBuffers()得到的是输入缓存数组,通过index和输入缓存数组可以得到当前请求的输入缓存,在使用之前要clear一下,避免之前的缓存数据影响当前数据,接着就是把数据添加到输入缓存中,并调用queueInputBuffer(...)把缓存数据入队;
5.输出数据
通常编码传输时每个关键帧头部都需要带上编码配置数据(PPS,SPS),但 MediaCodec 会在首次输出时专门输出编码配置数据,后面的关键帧里是不携带这些数据的,所以需要我们手动做一个拼接;
6.使用完MediaCodec后释放资源
要告知编码器我们要结束编码,Surface 输入的话调用 mMediaCodec .signalEndOfInputStream,普通输入则可以为在 queueInputBuffer 时指定 MediaCodec.BUFFER_FLAG_END_OF_STREAM 这个 flag;告知编码器后我们就可以等到编码器输出的 buffer 带着 MediaCodec.BUFFER_FLAG_END_OF_STREAM 这个 flag 了,等到之后我们调用 mMediaCodec .release 销毁编码器
流控就是流量控制。 为什么要控制,就是为了在一定的限制条件下,收益最大化!
涉及到了 TCP 和视频编码:
对 TCP 来说就是控制单位时间内发送数据包的数据量,对编码来说就是控制单位时间内输出数据的数据量。
TCP 的限制条件是网络带宽,流控就是在避免造成或者加剧网络拥塞的前提下,尽可能利用网络带宽。带宽够、网络好,我们就加快速度发送数据包,出现了延迟增大、丢包之后,就放慢发包的速度(因为继续高速发包,可能会加剧网络拥塞,反而发得更慢)。
视频编码的限制条件最初是解码器的能力,码率太高就会无法解码,后来随着 codec 的发展,解码能力不再是瓶颈,限制条件变成了传输带宽/文件大小,我们希望在控制数据量的前提下,画面质量尽可能高。
一般编码器都可以设置一个目标码率,但编码器的实际输出码率不会完全符合设置,因为在编码过程中实际可以控制的并不是最终输出的码率,而是编码过程中的一个量化参数(Quantization Parameter,QP),它和码率并没有固定的关系,而是取决于图像内容。 这一点不在这里展开,感兴趣的朋友可以阅读视频压缩编码和音频压缩编码的基本原理。
无论是要发送的 TCP 数据包,还是要编码的图像,都可能出现“尖峰”,也就是短时间内出现较大的数据量。TCP 面对尖峰,可以选择不为所动(尤其是网络已经拥塞的时候),这没有太大的问题,但如果视频编码也对尖峰不为所动,那图像质量就会大打折扣了。如果有几帧数据量特别大,但仍要把码率控制在原来的水平,那势必要损失更多的信息,因此图像失真就会更严重。 这种情况通常的表现是画面出现很多小方块,看上去像是打了马赛克一样,导致画面的局部或者整体看不清楚的情况
配置时指定目标码率和码率控制模式:
码率控制模式有三种:
码率控制模式在 MediaCodecInfo.EncoderCapabilities 类中定义了三种,在 framework 层有另一套名字和它们的值一一对应:
动态调整目标码率:
Android 流控策略选择
下面展示使用MediaExtractor获取数据后,用MediaMuxer重新写成一个MP4文件的简单栗子
Ⅲ 哪些品牌的手机使用的是安卓原生系统
目前来说除了被收购的摩托罗拉以外,不会一个品牌完全使用原生系统,都做了优化和大量修改,谁也不可能一直为谷歌打工不是么?
如果排除自行刷原生rom的话,谷歌的手机就那么几款,所谓的“谷歌亲儿子”
大儿子 Google Nexus One是谷歌公司于2010年1月推出的第一部自有品牌3G智慧手机。HTC
二儿子 Google Nexus S是一款搭载android2.3系统的旗舰智慧手机,三星代工;
三儿子 Google Galaxy Nexus这款手机由谷歌设计,三星公司进行代工生产;
四儿子 Google Nexus 4这款手机由谷歌设计,LG进行代工生产。
Android(安卓),是一个以Linux为基础的开源移动装置作业系统,主要用于智慧手机和平板电脑,由Google成立的Open Handset Alliance(OHA,开放手持装置联盟)持续领导与开发中。Android已释出的最新版本为Android 8.1。
Android系统最初由安迪·鲁宾(Andy Rubin)等人开发制作 ,最初开发这个系统的目的是建立一个数码相机的先进作业系统;但是后来发现市场需求不够大,加上智慧手机市场快速成长,于是Android被改造为一款面向智慧手机的作业系统。
于2005年8月被美国科技企业Google收购。2007年11月,Google与84家制造商、开发商及电信营运商成立开放手持装置联盟来共同研发改良Android系统,随后,Google以Apache免费开放原始码许可证的授权方式,释出了Android的原码,让生产商推出搭载Android的智慧手机,Android后来更逐渐拓展到平板电脑及其他领域上。
Xposed 框架需要使用安装器进行安装,所以我们需要先安装Xposed 框架安装器,安装完成开启后点击框架(如图中红框位置),进行框架的安装。
安装 Xposed 框架
点选后进入框架安装、升级接口,我们点选“安装/更新”,会出现ROOT授权提示,许可即可。这里我给大家个提醒,为了Xposed 框架及以后各种模组的良好执行建议使用好的授权管理,目前各种一键ROOT生成的各种授权管理程式可能无法满足Xposed 框架及以后各种模组的需求。建议使用SuperSU Pro。Xposed 框架安装完成后重启手机才能启用,可直接点选重启也可手动重启。
选用模组
我们安装Xposed 框架是为了使用各种模组,而增强手机的各种功能。在Xposed 框架安装器中可以点选“下载”进入模组仓库下载自己需要的模组,不过这里全是英文,可能与我一样英文不好的朋友用起来有难度。还有个方法就是,直接安装需要的模组后,在Xposed 框架安装器中点选“模组”进入模组接口进行勾选,这里以红色守护的试验性功能为例,勾选后模组就开始发挥作用了。
不是,都是LG基于安卓优化过的UI,可以刷第三方的ROM,目前LG只给出了2.2正式版跟2.3测试版
至少双核手机RAM要足够EVO原要让奸商帮刷民间像少原且原没稳定点
品牌不同,配置、设计理念、适用人群等也是不一样的,各有优势,建议根据需求及喜好选择合适的机型。
如需了解三星产品的详细机型资讯,请登陆官网-点选右上角放大镜图示输入型号查询。
Gigaset ME的系统是Android OS 5.1
瓦砾8级2011-03-03不多,亲儿子只有Nexus one,现在还有Nexus S 。 追问: 这两款手机在哪里可以买到?多少钱? 回答: Nexus one已经没有全新的了,应该是,据说有韩版的,价格在3000多,全新的,二手的新一点点也差不多这个价,2500以上。Nexus S 价格在4500多。途径一般是淘宝,或者eBay。 追问: 定制的系统和原生系统使用起来有差别吗?哪个软体相容性更好? 回答: 同版本核心一样,只有接口UI不同,没用过不清楚。破解和取得ROOT许可权,可以刷第三方的系统,有人就是喜欢改的乱七八糟的,有人却喜欢原生态的,简单的。软体相容都差不多,跟系统版本有关。目前Nexus one,现在还有Nexus S 是更新到2.3.3,其他机器都只有2.1或者2.2,介于CPU和记忆体的关系强刷2.3.3也没有好处。此类机器“刷”就是一种乐趣。 追问: 现在安卓哪个版本的系统最稳定?一般的手机都能刷到这个版本吗? 回答: 用过的版本都很稳定,1.5 /2.0/2.1/2.2/2.2.2/2.3.3 不是所有机器都能刷原厂韧体,你买了就知道了。产品太多,不一一说了。 追问: 所有版本的软体都可以通用吗? 回答: 有要求版本的,其他基本通用 追问: 分辩率不同对软体的相容有影响吗? 回答: 电视机不同,DVD机器有影响吗?
Ⅳ 什么是安卓原生态系统
原生android是指Google公司发布的最原始纯净的安卓系统,没有经过手机厂商的任何修改。
Android一种基于Linux的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。
尚未有统一中文名称,中国大陆地区较多人使用“安卓”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。
2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。
(4)androidm原生扩展阅读
Android本身是一个权限分立的操作系统。在这类操作系统中,每个应用都以一个系统识别身份运行(Linux用户ID与群组ID)。系统的各部分也分别使用各自独立的识别方式。Linux就是这样将应用与应用,应用与系统隔离开。
系统更多的安全功能通过权限机制提供。权限可以限制某个特定进程的特定操作,也可以限制每个URI权限对特定数据段的访问。
Android安全架构的核心设计思想是,在默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这其中包括读写用户隐私数据(联系人或电子邮件),读写其他应用文件,访问网络或阻止设备待机等。
安装应用时,在检查程序签名提及的权限,且经过用户确认后,软件包安装器会给予应用权限。从用户角度看,一款Android应用通常会要求如下的权限:
拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、对互联网的完全访问、查看网络状态;
查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。
Ⅳ Android 系统原生相机API角度原理与适配
虽然Camera作为第一代原生android所提供的相机类一直被开发者甚至Google官方开发人员所诟病,但为了兼容和适配Android版本5.0以下的App应用,我们别无选择。因此,有了本篇文档详细阐述1.0版的Camera 是如何使用的。本篇使用的是SurfaceView与Camera类。
文档下文会在拍照流程中的不同的阶段应用到上述四个角度,而“终端自然方向”贯穿整个流程当中。这一个方向、四个角度非常重要,缺一不可,是支撑相机Camera 系列API的关键。在设计NXDesign的相机项目中,经过对官方文档的研读和各路资料的调研之后发现,我们在网络上查到的博客类相关资料有80%的实现方式是存在问题的,当然,这也可以归咎于该API其本身确实不好用,如果不对源码注释进行仔细研究,很容易对开发者产生误导。
更加准确的说,相机的生命周期是依托于SurfaceView的创建和销毁来完成的。SurfaceView的作用是提供相机内容的实时预览。我们需要在surfaceview创建好之后打开相机使用相机资源,在surfaceview被销毁后释放相机资源。
surfaceview 提供了holder机制向调用方通知surfaceview的变化时机,为了在不同的时机对相机资源做不同的事情,需要调用SurfaceHolder.addCallback()方法。
现在的Android手机一般会有多个摄像头,但根据其方向可以归为两类: CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 。在打开摄像头之前,首先需要获取相机资源,判断相机个数 Camera.getNumberOfCameras() 。每个相机对应一个CameraInfo,它的定义如下:
这里涉及到一个重要概念:相机图像传感器(camera sensor),想要理解上述注释的含义,就需要先理解下图内容。
左图是通常情况下,我们对view的x y方向的认知,以屏幕的左上角为原点向右为x正方向,向下为y正方向;但是,右图描述的是绝大多数情况下, 相机图像传感器 的起始位置和方向判定。与view不同的是,传感器以手机屏幕在自然方向上的右上角为原点,向下为x正方向,向左为y正方向。因此,我们理解上述注释就不难了。如果相机自带的传感器顶部与终端自然方向(手机屏幕的硬件方向,一般手机都是竖直方向,也就是文档中说的naturally tall screen)的右边缘一致,则这个值就是90度。如果前置摄像头传感器的顶部与手机自然方向一致,则这个值就是270度。
当我们定义startCamera()方法时,要做5件事情,1.遍历摄像头cameraId,找到想要打开的摄像头(前置还是后置);2.获取摄像头信息,主要获取orientation;3. 设置相机DisplayOrientation 4.设置相机参数,主要是宽高比、对焦模式、图片格式、setRotation等。5. 向camera设置surfaceview.viewholder,并且startPreview。主要逻辑如下:
拿到cameraInfo.orientation之后,要调用camera.setDisplayOrientation设置进去,保证通过surfaceview预览到的取景跟当前的手机方向保持一致,但是,setDisplayOrientation设置的其实是经过两个角度计算之后的复合角度,而并不单纯是cameraInfo.orientation。正确的做法是这样的:先获取手机屏幕的旋转方向,然后与cameraInfo.orientation加和得到最终角度。通常情况下,如果我们设置相机为portrait,则不用考虑rotation。这也是为什么绝大部分网络资料中都会粗暴的写入一个90度完事儿而并没有解释这么做的道理。
调用camera.takePicture(null, null, pictureCallback)
这里需要做的仅仅是将callback中返回的data存储为File。需要注意的是,data中会包含setRotation()方法中的角度信息,因此如果直接使用Bitmap工具类生成bitmap,再进行存储或者展示,生成出来的图像其实是缺失了旋转角度的原始方向,这十有八九会发生图像展示角度错误的情况。因此,需要直接保存,再通过Exif工具类读取File中的角度信息(当然Exif工具类就是为了读取File中的各种信息而生的,比如拍照时间、经纬度等等)。
基于Camera API,
surfaceview的预览需要setDisplayOrientation(),入参角度与CameraInfo.orientation(传感器偏角)和WindowManager.default.displayOrientation(屏幕旋转角度)两个角度有关。
相机拍照前需要setRotation(),入参角度与CameraInfo.orientation(传感器偏角)和OrientationEventListener返回的orientation(终端自然角度偏角)有关,二者的换算结果就是图像写入偏角,该偏角意味着图像被顺时针旋转该角度就能够回正展示。