1. 程式人生 > >Android自定義相機Camera(一)

Android自定義相機Camera(一)

Time:2018/06/21 

因為專案需求,需要實現跟小猿搜題的類似的功能,系統相機直接就被排除了,原本打算是找個一個demo,改吧改吧就直接用了,找的過程中發現程式碼太舊了,目前6.0以上的系統很多不支援,然後按照demo的邏輯,就寫一個相機。過程中發現不是程式碼舊了,TM是系統已經更新Camera的API了,好懵逼。所以先總結一個API21之前的程式碼,待我去瞅瞅Camera2,在優化現有功能。

一:Android開發兩種相機的使用

1. 直接通過Intent呼叫系統相機元件。這種方法方便快捷,不需要去考慮Camera的各種Parameters(主要是previewSize、pictureSize方式二會詳細講解)
2.
使用相機API來定義符合自己開發需求的相機,Android提供了Camera來控制拍照。這種方法適用於定製專案專用相機介面。(在使用的過程中發現Camera已經被摒棄了,API21 中出現了Camera2這個類來代替Camera)這裡主要講一下自定義相機遇到的坑以及自己的感悟。
思路:
(1)建立顯示相機的佈局,SurfaceView,後面再講WHY。
(2)在自定義View構造方法裡面,得到SurfaceVIewHolder的物件
(3)在SurfaceView建立時呼叫Camera.open  開啟相機,然後在設定用於顯示拍照攝像的SurfaceHolder物件,在呼叫Camerade的startPreview()的方法開始預覽取景。
(4)接下來再surFaceChange(Surface改變時)裡面設定Camera的引數,setParameters,在這個地方因為國內廠家定製的系統,很多手機找不到自己合適的預覽尺寸和圖片尺寸,在這個地方我被坑了好久好久,最後一隻try catch,設定固定的值,才解決。
(5)呼叫Camera的takePicture()方法進行拍照。

(6)最後就是stopPreview,和release()釋放資源。三個地方需要,在takePicture之後需要在回撥裡面進行stop,在surFaceDestory裡面也要進行stop,還要在定義一個方法對外提供stop。

直接開懟:

自定義相機肯定跟自定義View肯定分不開,按我的理解,我感覺是用自定義View來承載相Camera的畫面。