Ⅰ 什麼是原生安卓
原生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(終端自然角度偏角)有關,二者的換算結果就是圖像寫入偏角,該偏角意味著圖像被順時針旋轉該角度就能夠回正展示。