Android 相機(Camera)拍照入門(一)

開始之前

? ? ? ? ?這是我第一次寫博客,現(xiàn)在想想我已經學習Android快兩年,但仍記得那個說十年太久,希望兩年后的你還記得自己最初的模樣的少年。雖然現(xiàn)在我沒有能夠成為兩年前希望的模樣,但也有了一份不錯的工作,算是沒有對不起那個執(zhí)著的少年。從今天起我決定開始寫博客,來記錄自己的成長。

? ? ? ? ?今天我想要寫的是我們Android App開發(fā)中比較常用的攝像頭相關的知識,之所以寫這個,是因為最近在公司的項目中用到了拍照的功能。更重要的是相機現(xiàn)在作為每一款手機所必備的功能,比如拍照、錄制短視頻、掃描二維碼以及人臉識別等都需要用到Camera。因此作為一個好的Android App開發(fā)者怎么能對Camera不了解呢。起初我認為在開發(fā)中對Camera的使用僅限于調用系統(tǒng)相機進行拍照,然后拍照后獲取拍照的圖片,覺得這個沒有什么還需要學習。后來在項目的開發(fā)中發(fā)現(xiàn)我錯了呀,Camera在實際開發(fā)中不僅僅是調用系統(tǒng)相機來拍照,還需要我們去自定義相機來進行拍照和錄像等功能。

Camera兩種常見的使用方式

? ? ? ? ? ?1、調用系統(tǒng)相機、或者具有相機功能的應用

? ? ? ? ? ?2、自定義相機

一、調用系統(tǒng)相機的步驟

方法一:不指定圖片保存的路徑,通過Activity的onActivityResult()中獲取拍照的圖片(Bitmap)

? ? ? ? ?1、在清單文件中添加相機權限

相機權限

? ? ? ? ?2、使用隱式Intent的跳轉到系統(tǒng)相機

跳轉到系統(tǒng)相機

? ? ? ? ?3、在重寫的onActivityResult的回調方法中獲取拍照所得的圖片

相機的回調

? ? ? ? ?4、運行Demo的效果圖

運行Demo效果圖(不指定Uri)


? ? ? ? 總結:這種方法實現(xiàn)還是比較簡單的,但我們通過運行Demo的效果gif圖可以看出在onActivityResult()中獲取到的圖片是很小的一張經過壓縮的圖片。我通過debug可以查看獲取到的圖片bitmap的尺寸大小是194*262。這個圖片壓縮還是很嚴重的,只適用于對圖片要求不高的場景。

方法二:指定圖片保存的地址,還是在onActivityResult方法中獲取拍照的圖片

? ? ? ? 1、添加相機以及讀取sd卡的權限

相機和讀取sd卡的權限

? ? ? ? 2、跳轉到系統(tǒng)相機拍照,并指定拍照原圖的保存位置(Uri)

跳轉到系統(tǒng)相機并指定原圖保存的Uri


創(chuàng)建用來保存拍照原圖的文件

? ? ? ? ? 3、在重寫的onActivityResult的回調方法中獲取拍照所得的圖片

相機的回調

? ? ? ? ? 4、運行Demo的效果圖

運行Demo的效果圖(指定Uri)

? ? ? ? ? 總結:這種方法相對于第一種稍微復雜了一點,需要指定圖片保存的Uri,不過實現(xiàn)起來也挺容易的。但我們可以通過運行Demo的效果圖可以看出相比方法一,獲取到的圖片就是原圖。我們可以通過debug查看獲取到圖片的尺寸是3104*4192,在我們指定的目錄中也可以找到剛才拍照的圖片,它的大小在3M左右。最初開始用這種方法獲取拍照原圖的時候,覺得Google這種設計很不好,為什么不像方法一返回原圖的Bitmap對象。后來自己的項目中寫了自定義相機才知道為什么不能直接回傳原圖的Bitmap對象。是因為Activity之間跳轉傳遞數(shù)據(jù)大小是有限制。一張原圖所占的內存是相當大的,比如Demo拍照原圖Bitmap對象在代碼中所占的大小是3104*4192*4/1024/1024=49.6M。這應該就是Google不直接返回原圖Bitmap的原因吧,而且實際開發(fā)中我們也不可能直接使用拍照的原圖。在開發(fā)中都需要對原圖進行壓縮處理,壓縮圖片在下面的自定義相機中會說到。

二、自定義相機

? ? ? ? ?在API 21之前Google給開發(fā)者提供Camera類來實現(xiàn)自定義相機,但API 21之后Camera就過時了,被一個Camera2類所取代。Demo中自定義相機的實現(xiàn)使用的還是Camera類。Camera2還沒有研究過。因為自定義相機的代碼太多,我會貼出一些關鍵的代碼,文章底部會給出代碼github的地址。寫Demo時我盡可能寫所有注釋。

? ? ? API提供的自定義相機的步驟

自定義相機的步驟

? ? ? ?1、獲取相機(Camera)的實例,通過open(int),參數(shù)是攝像頭的id(前、后攝像頭) ? ? ? ? ? ? ?

? ? ? ?2、獲取相機的默認參數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ?3、設置相機相關的參數(shù) ?比如:預覽尺寸、拍照圖片的尺寸、圖片的格式

? ? ? ?4、設置屏幕的旋轉方向,確保預覽方向正確?

? ? ? ?5、重要:關于相機的預覽,Google給出的是使用SurfaceView進行預覽。給SurfaceView的SurfaceHold添加callback,就可以獲取到SurfaceHold及其SurfaceView的寬高。也就是我們需要設置的預覽尺寸。必須先設置SurfaceHold,否則相機無法啟動預覽。

? ? ? 6、重要:調用startPreview()開始預覽,先開始預覽才能獲取圖片。

? ? ? 7、調用takePicture(...)方法進行拍照,回調中可以獲取到圖像數(shù)據(jù)了。

? ? ?8、拍照后將停止預覽,如果需要拍照多張就需要重新開始預覽。

? ? ?9、停止預覽

? ?10、非常重要:釋放相機資源,在onPause()中調用release()、在onResume()中重新打開。(如果沒有及時釋放相機資源會導致其他地方無法使用相機、而且非常的耗電)

? ?實際開發(fā)中自定義相機還是比較復雜的,不僅僅上面這幾個步驟和要求。我還要考慮到縮放、聚焦、手機的旋轉的方向、轉換攝像頭、圖片壓縮等。了解這些之后我們先看一下我的Demo的項目結構,以及每個類的作用。

? ?Demo關鍵類介紹

類介紹

CameraManager是一個單例類,是相機的管理類。主要是相機的初始化、參數(shù)的設置、拍照等。

CameraUtils是相機工具類,主要是進行一下計算,比如預覽尺寸、圖片尺寸、手機旋轉的方向、聚焦點等。

CameraView就是自定義相機的界面View,主要是相機預覽(SurfaceView)、用戶的交互(拍照、取消、重拍、確定)以及用戶手勢的監(jiān)聽和處理(縮放、聚焦、轉換攝像頭)還有利用重力感應判斷手機的旋轉方向等。

CaptureLayout是拍照相關操作的界面的布局,寫這個是為了不使CameraView過于臃腫,CameraView中進行邏輯處理、UI的操作在該布局中處理。

FocusView是一個自定義VIew,是顯示當前聚焦點的View。

? CameraManager

? 1 、打開相機

打開相機

? ?2、拍照

?主要就是這兩個方法,還有其他比如設置SurfaceHold、設置縮放倍數(shù)、設置聚焦點、轉換攝像頭、設置手機的旋轉方向等就不貼出來了。這些方法都比較簡單容易理解。

CameraView

該View繼承子FrameLayout,包含預覽的SurfaceView、拍照后圖片展示的ImageView、拍照相關的按鈕布局等。

1、SurfaceView狀態(tài)的監(jiān)聽,根據(jù)SurfaceView的狀態(tài)來開啟/關閉相機

? ? ?2、和用戶的交互

CaptureLayout

? ?1、布局文件

這個類和Camera一點關系都沒有,只是拍照界面的 取消、拍照、重拍、確認幾個按鈕的展示以及和用戶的交互。沒有難懂的地方。 ?

效果圖

自定義相機的效果圖

總結

? ? ? ? ?主要就是這么多,文章中只貼出來了關鍵的代碼,要真正理解、使用自定義相機還需要去github上將Demo克隆或者下載下來。結合相機(Camera)的API來看代碼就會真正懂得自定義相機。

? ? ? ? ? 第一次寫博客,雖然寫的不是很好,但我開始嘗試寫了。在寫的過程中技術是第一個難點,之后就是如何將這些技術問題直接明了的描述清楚也是很重要的。

github地址:github.com/AiTheAnswer/SystemCameraDemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,008評論 25 709
  • 上一篇介紹了如何使用系統(tǒng)相機簡單、快速的進行拍照,本篇將介紹如何使用框架提供的API直接控制攝像機硬件。 你還在為...
    Xiao_Mai閱讀 7,379評論 4 18
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,256評論 4 61
  • Android中開發(fā)相機的兩種方式Android系統(tǒng)提供了兩種使用手機相機資源實現(xiàn)拍攝功能的方法,一種是直接通過I...
    開發(fā)者也閱讀 3,122評論 0 14
  • os模塊 os.name 字符串指示你正在使用的平臺。比如對于Windows,它是'nt',對于Linux/Uni...
    北海uu閱讀 270評論 0 0

友情鏈接更多精彩內容