<b>Android Camera</b><b>簡述</b>
好吧,别人的分析都是系統層面的==,我這算是醬油文章麼?默默路過T^T。
<b>一、</b><b>Camera</b>
package android.hardware
該類用于設定圖像捕獲設定,開啟/關閉預覽,抓拍圖檔以及擷取幀用于編碼視訊。這個類是Camera服務的用戶端,用于管理真實的照相機硬體。
為了能夠通路照相機,你必須在你的Android Manifest内聲明CAMERA權限。同時確定包括了<uses-feature>節點元素,來聲明你所使用的camera功能。例如,如果你使用了照相機的自動對焦功能,你的Manifest應當包括以下内容:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
用該類拍照的執行步驟:
1. 通過open(int)函數,獲得一個Camera執行個體。
2. 通過getParameters()函數,獲得已有的設定(預設)。
3. 如果需要的話,調用setParameters(Camera.Parameters)函數,修改第二步傳回的Camera.Parameters對象。
4. 如果需要的話,調用setDisplayOrientation(int)函數,設定螢幕水準或垂直。
5. <b>重要</b>:傳遞一個已初始化好的SurfaceHolder對象給setPreviewDisplay(SurfaceHolder)函數。如果沒有surface,camera将無法打開預覽。
6. <b>重要</b>:調用startPreview()函數開始更新預覽surface。預覽必須在你照相前啟動。
7. 在你想要捕獲一張照片時,調用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)函數。等待回調函數中給出的實際圖像資料。
8. 在照相後,預覽顯示将會停止。如果要照更多相片,需要再次調用startPreview()函數(回至第六步)。
9. 調用stopPreview()函數,停止更新預覽surface。
10. <b>重要</b>:調用release()函數,釋放camera引用,以便其他應用使用。應用應當在onPause()調用時立刻釋放camera引用(在onResume()時重新打開它)。
快速轉換到視訊錄像模式,用以下步驟:
1. 如上所述,擷取一個初始化好的Camera對象并開啟預覽。
2. 調用unlock()函數,以允許media程序得以通路camera。
3. 傳遞目前camera對象至setCamera(Camera)函數。請檢視MediaRecorder關于視訊錄制的資訊。
4. 當結束錄制時,調用reconnect()函數重新取的和加鎖camera對象。
5. 如上所述,調用stopPreview()和release()函數,結束拍攝。
這個類是線程不安全的,意味着是通過event線程使用的該類。大多數長時間運作的操作(預覽、聚焦、拍照等)都是非同步的,并且是在需要的時候才會回調。而這些回調函數是在event線程open(int)函數被調用時觸發的。是以,該類的方法一定不能在多線程内調用。
警告:不同的Android裝置有不同的硬體規格,如兆像素等級和自動對焦性能。為了使你的應用和更多裝置相容,最好不要限制camera規格。
翻譯自:官方SDK文檔(無聊的緊啊==)。
<b>二、照相</b>
<b>1</b><b>)系統相機</b>
1.1)調用方式
系統相機的入口Action:MediaStore.ACTION_IMAGE_CAPTURE。隻需以startActivityForResult(…)啟動該Activity即可。
1.2)處理方式
在onActivityResult(…)中,處理傳回資訊。
<b>2</b><b>)自定義相機</b>
2.1)照相預覽
繼承SufaceView寫自己的預覽界面,繼而放到你的照相Activity的布局裡。可以寫個照相監聽接口,用于在Activity裡處理這些照相操作。
2.2)照相活動
就是我們自己做的照相Activity了。完成後調用自己的相機,也就是跳轉入這個Activity。而獲得照片後,可以直接處理或者存入媒體庫。
2.3)照相調用
以startActivityForResult(…)方式跳轉入照相Activity,在拍完照片後setResult(…)傳回。建議存入媒體庫,将照片的uri傳回。直接data資料的話,多拍時,是承受不了的==。
2.4)照相處理
<b>三、攝像</b>
<b>1</b><b>)系統攝像</b>
系統攝像的入口Action:MediaStore.ACTION_VIDEO_CAPTURE。視訊捕捉intent可以包含以下附帶資訊:
MediaStore.EXTRA_OUTPUT——本設定需要一個Uri,用于指定儲存視訊的路徑和檔案名。本設定是可選項,但強烈建議使用。如果未指定本設定值,那麼攝像應用将會把所請求的視訊以預設檔案名和路徑進行儲存,并将資料置入intent的Intent.getData()部分傳回。
MediaStore.EXTRA_VIDEO_QUALITY——本值用0表示最低品質及最小的檔案尺寸,用1表示最高品質和較大的檔案尺寸。
MediaStore.EXTRA_DURATION_LIMIT——本值用于限制所捕獲視訊的長度,以秒為機關。
MediaStore.EXTRA_SIZE_LIMIT——本值用于限制所捕獲視訊的檔案尺寸,以位元組為機關。
<b>2</b><b>)自定義攝像</b>
2.1)流程簡述
Android架構的視訊捕捉需要對Camera對象進行仔細的管理,還要與MediaRecorder類一起協同工作。使用Camera錄制視訊時,必須管理好Camera.lock()與Camera.unlock()的調用,使得MediaRecorder能夠順利通路攝像頭硬體,并且還要進行Camera.open()和Camera.release()調用。
<b>注意:</b>自Android 4.0 (API level 14) 開始,Camera.lock()和 Camera.unlock()調用由系統自動管理。
與用攝像頭拍照不同,視訊捕獲必需十分精确地按順序進行調用。必須按照特定的順序來執行,應用程式才能成功地準備并捕獲視訊,詳細步驟如下。
1. <b>打開攝像頭</b>——用Camera.open()來獲得一個camera對象的執行個體。
2. <b>連接配接預覽</b>——用Camera.setPreviewDisplay()将camera連接配接到一個SurfaceView,準備實時預覽。
3. <b>開始預覽</b>——調用 Camera.startPreview()開始顯示實時攝像畫面。
4. <b>開始錄制視訊</b>——嚴格按照以下順序執行才能成功錄制視訊:
a. <b>解鎖Camera</b>——調用Camera.unlock()解鎖,便于MediaRecorder使用攝像頭。
b. <b>配置MediaRecorder</b>——按照如下順序調用MediaRecorder中的方法。詳情請參閱MediaRecorder參考文檔。
1. setCamera()——用目前Camera執行個體将攝像頭用途設定為視訊捕捉。
2. setAudioSource()——用MediaRecorder.AudioSource.CAMCORDER設定音頻源。
3. setVideoSource()——用MediaRecorder.VideoSource.CAMERA設定視訊源。
4. 設定視訊輸出格式和編碼格式。對于Android 2.2 (API Level 8) 以上版本,使用MediaRecorder.setProfile方法,并用CamcorderProfile.get()來擷取一個profile執行個體。對于Android prior to 2.2以上版本,必須設定視訊輸出格式和編碼參數:
i. setOutputFormat()——設定輸出格式,指定預設設定或MediaRecorder.OutputFormat.MPEG_4。
ii. setAudioEncoder()——設定聲音編碼類型。指定預設設定或MediaRecorder.AudioEncoder.AMR_NB。
iii. setVideoEncoder()——設定視訊編碼類型,指定預設設定或者 MediaRecorder.VideoEncoder.MPEG_4_SP。
5. setOutputFile()——用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()設定輸出檔案,見儲存媒體檔案一節中的方法示例。
6. setPreviewDisplay()——用上面<b>連接配接預覽</b>中設定的對象來指定應用程式的SurfaceView預覽layout元素。
<b>警告:</b> 必須按照如下順序調用MediaRecorder的下列配置方法,否則應用程式将會引發錯誤,錄像也将失敗。
c. <b>準備MediaRecorder</b>——調用MediaRecorder.prepare()設定配置,準備好MediaRecorder。
d. <b>啟動MediaRecorder</b>——調用MediaRecorder.start()開始錄制視訊。
5. <b>停止錄制視訊——</b>按照順序調用以下方法,才能成功完成視訊錄制:
a. <b>停止MediaRecorder</b>——調用MediaRecorder.stop()停止錄制視訊。
b. <b>重置MediaRecorder</b>——這是可選步驟,調用MediaRecorder.reset()删除recorder中的配置資訊。
c. <b>釋放MediaRecorder</b>——調用MediaRecorder.release()釋放MediaRecorder。
d. <b>鎖定攝像頭</b>——用Camera.lock()鎖定攝像頭,使得以後MediaRecorder session能夠使用它。自Android 4.0 (API level 14)開始,不再需要本調用了,除非MediaRecorder.prepare()調用失敗。
6. <b>停止預覽</b>——activity使用完攝像頭後,應用Camera.stopPreview()停止預覽。
7. <b>釋放攝像頭</b>——使用Camera.release()釋放攝像頭,使其它應用程式可以使用它。
<b>注意:</b> 也可以不必先建立攝像頭預覽就使用MediaRecorder,并跳過本節開始的幾步。不過,因為使用者一般都希望在開始錄像前看到預覽畫面,這裡就不讨論那類過程了。
摘錄自:後記->參閱内容1
2.2)攝像預覽
攝像頭預覽類,用于嵌入一個View布局中。其實作了SurfaceHolder.Callback接口來捕捉view建立和銷毀時的回調事件。
2.3)攝像活動
按官方開發者指南裡的流程實作的(參閱2.1流程簡述)。但這不同版本和硬體下有些問題==,在代碼裡有稍帶說明。
ps:至于想要實作一個優秀的Camera攝像,請看後記->參閱内容2。
2.4)攝像調用
以startActivity (…)方式跳轉入攝像Activity即可。當然也可以用startActivityForResult(…),在攝像完成後setResult(…)傳回^^。
<b>四、後記</b>
<b>1</b><b>)參閱内容</b>
1.1)SDK docs->Dev Guide->Multimedia and Camera->Camera
1.2)Camera攝像在不同版本不同硬體環境下不通用==
想實作更優秀的方式,請參考Sipdroid開源項目^^
參考檔案:org.sipdroid.sipua.ui包下的VideoPreview.java&VideoCamera*.java
ps:可以考慮學習下該開源項目,求入手分析資料啊T^T
<b>2</b><b>)子產品概覽</b>
2.1)Camera照相
<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106502.png"></a>
2.2)Camera攝像
<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106968.png"></a>
<b>3</b><b>)運作效果</b>
1)相機調用
<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106369.png"></a>
2)自定義相機
<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106280.png"></a>
3)攝像調用
<a target="_blank" href="http://blog.51cto.com/attachment/201204/083408332.png"></a>
4)自定義攝像
<a target="_blank" href="http://blog.51cto.com/attachment/201204/083205699.png"></a>
本文轉自winorlose2000 51CTO部落格,原文連結:http://blog.51cto.com/vaero/834878,如需轉載請自行聯系原作者