Android camera(8)---Camera2詳解之一 API學習
Camera2的API出來有些年頭了,只是趕專案多次使用,沒時間好好總結,年終了,正好結合google的官方Camera2demo 和開發中使用的情況,做個詳細梳理,研究總結之後,才發現Camera2並非想象的難用,充分理解相關幾個類之後,實現自己需求還是很簡單的。
該篇詳細介紹Camera2相關的類,根據API各個類的方法,欄位含義都詳細用表格記錄。
下一篇將介紹Camera2的使用流程。
<一>SurfaceView 相關的類
在Camera的時候,自定義相機預覽首選 SurfaceView當展示佈局,更深層的結合openCV openGL庫的GLSurfaceView,做渲染濾鏡遊戲動畫等。首先了解相關類SurfaceView和SurfaceHolder的API。
當SurfaceView視窗可見時,就可以建立這個表面,當urfaceView展示或者隱藏時,需要對它進行建立和銷燬,你就需要實現SurfaceViewCreated(SurfaceHolder)方法或者SurfaceViewDestroyed(SurfaceHolder)方法。
這個類的用途之一就是提供了一個可以在螢幕上顯示輔助執行緒的Surface,要使用,需要了解執行緒語義:回撥方法Callback將從執行的SurfceView視窗呼叫,所以需要正確的同步繪製執行緒。在SurfaceHolder.Callback.surfaceCreated() 方法和 SurfaceHolder.Callback.surfaceDestroyed()方法之間是有效的期間,你必須確保繪圖執行緒只和使用的SurfaceView有聯絡。
注意:從android7.0開始,SurfaceView的視窗位置與其他檢視呈現同步更新。這意味著在螢幕上平移和縮放一個SurfaceView將不會導致呈現工件
public方法 | 解釋 |
---|---|
void draw(Canvas canvas) | 手動的將各種view渲染到給定的畫布上 |
boolean gatherTransparentRegion(Region region) | 當檢視層次結構包含一個或多個SurfaceView時,RootView使用它來執行優化。 |
SurfaceHolder getHolder() | 返回SurfaceHolder,用於訪問和控制SurfaceView |
void setSecure(boolean isSecure) | 控制表面檢視的內容是否應該被視為安全的,防止它出現在螢幕截圖中或在非安全顯示中被檢視。注意,必須在視窗管理器的視窗檢視包含視窗之前設定此設定。 |
void setVisibility(int visibility) | surfaceView可見設定 |
void setZOrderMediaOverlay(boolean isMediaOverlay) | surfaceView1是否被放置在另一個surfaceView2檢視上 |
setZOrderOnTop(boolean onTop) | 在自己的window內,設定最頂層顯示 |
protected的方法
protected方法 | 解釋 |
---|---|
void dispatchDraw(Canvas canvas) | 由draw呼叫繪製子view |
void onAttachedToWindow() | 檢視view依附到window上被觸發 |
void onDetachedFromWindow() | 檢視view從window上分離被觸發 |
onMeasure(int widthMeasureSpec, int heightMeasureSpec) | 繪製view的寬高 |
onWindowVisibilityChanged(int visibility) | 在檢視持續可見和不可見變化時觸發 |
<2> SurfaceHolder API
返回值(abstract) | 方法 | 解釋 |
---|---|---|
void | addCallback(SurfaceHolder.Callback callback) | 為整個holder添加回調介面 |
Surface | getSurface() | 直接訪問surface物件 |
Rect | getSurfaceFrame() | 獲取surface的尺寸大小 |
boolean | isCreating() | 使用這個方法來找出是否在從回撥方法建立的過程中。 |
Canvas | lockCanvas() | 開始編輯surface的畫素 |
void | unlockCanvasAndPost(Canvas canvas) | 結束編輯surface畫素 |
Canvas | lockCanvas(Rect dirty) | 開始編輯surface的畫素,但是允許特殊矩形 |
default Canvas | lockHardwareCanvas() | 開始編輯surface的畫素,但是返回的畫布是硬體加速的 |
void | removeCallback(SurfaceHolder.Callback callback) | 從holder移除回撥介面 |
void | setFixedSize(int width, int height) | 修改surface 尺寸 |
void | setFormat(int format) | 設定surface的畫素格式 格式:PixelFormat |
abstract void | setKeepScreenOn(boolean screenOn) | 啟用或禁用選項,以便在顯示該介面時開啟螢幕。 |
void | setSizeFromLayout() | 允許Surface根據其容器的佈局調整大小 |
<3> SurfaceHolder.Callback介面
重寫方法 | 解釋 |
---|---|
surfaceChanged(SurfaceHolder holder, int format, int width, int height) | surface改變回調 |
surfaceCreated(SurfaceHolder holder) | surface第一次建立就回調 |
surfaceDestroyed(SurfaceHolder holder) | surface銷燬回撥 |
<二>Camera2 相關的類
<1>CameraManager
官方文件解釋:
一種系統服務管理器,用於檢測、描述和連線到照相機裝置。
獲取該例項的方法:CameraManager manager =(CameraManager)Context.getSystemService(Context.CAMERA_SERVICE);或者
CameraManager manager =(CameraManager)Context. getSystemService(CameraManager.class);
返回值 | 方法名 | 解釋 |
---|---|---|
CameraCharacteristics | getCameraCharacteristics(String cameraId) | 查詢攝像機裝置的功能。 |
String[] | getCameraIdList() | 通過識別符號返回當前連線的相機裝置的列表,包括可能被其他相機API客戶端使用的相機。 |
openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler) | 開啟一個帶有給定ID的相機的連線。 | |
registerAvailabilityCallback(CameraManager.AvailabilityCallback callback, Handler handler) | 註冊一個回撥,以獲得關於相機裝置可用性的通知。 | |
registerTorchCallback(CameraManager.TorchCallback callback, Handler handler) | 註冊一個回撥,以獲得關於torch mode狀態的通知。 | |
setTorchMode(String cameraId, boolean enabled) | 在不開啟相機裝置的情況下,設定閃光燈的閃光燈模式。 | |
unregisterAvailabilityCallback(CameraManager.AvailabilityCallback callback) | 刪除之前新增的回撥,回撥將不再接收連線和斷開回調。 | |
unregisterTorchCallback(CameraManager.TorchCallback callback) | 刪除之前新增的回撥,回撥將不再接收torch mode狀態回撥。 |
<1-1>CameraManager.AvailabilityCallback
CameraManager的內部類AvailabilityCallback回撥,官方文件解釋:
一個用於相機裝置的回撥或無法開啟的回撥。
當相機不再使用時,或者當一個新的可拆卸相機連線起來時,Cameras就會變的可用了。
當一些應用程式或服務開始使用相機時,或者當一個可移動的相機被斷開時,它們就變得不可用了。
擴充套件這個回撥並將子類的例項傳遞給CameraManager的registerAvailabilityCallback(CameraManager.AvailabilityCallback, Handler) 方法通知這些可用性更改。
回撥方法名 | 解釋 |
---|---|
onCameraAvailable(String cameraId) | 一個新的相機已經可以使用了。 |
onCameraUnavailable(String cameraId) | 以前可用的相機已經不可用了。 |
<1-2>CameraManager.TorchCallback
CameraManager的內部類TorchCallback回撥,官方文件解釋:
一個相機閃光燈torch模式變得可用不可用的回撥。
當相機裝置所屬的相機裝置變得不可用或其他相機資源時,由於其他更高的優先順序相機活動, torch mode就變得不可用。當它被關閉時,或者當它所屬的相機裝置不再使用,它所需要的其他相機資源不再忙碌時,torch mode就會不可用。當應用程式呼叫CameraManager的setTorchMode(String, boolean)關閉相機的torch mode,或者當應用程式開啟其他相機的torch mode,,如果同時不支援多個火炬模式,相機的torch mode就會被關閉。當通過setTorchMode(String, boolean)開啟torch mode時,torch mode就會可用。
只有當處於禁用或啟用狀態時,才可以通過setTorchMode(String、boolean)設定torch mode。
擴充套件這個回撥並將一個子類的例項傳遞給CameraManager的registerTorchCallback(CameraManager.TorchCallback, Handler)將被通知此類狀態更改。
回撥方法名 | 解釋 |
---|---|
onTorchModeChanged(String cameraId, boolean enabled) | setTorchMode(String, boolean)觸發 |
onTorchModeUnavailable(String cameraId) | setTorchMode(String, boolean)觸發 |
<2>CameraDevice
官方文件詳解:
CameraDevice 類是一個連線安卓裝置的單一攝像頭的代表,可以在高幀率下對影象捕捉和後期處理進行精確控制。
你的應用程式需要在manifest中生命相機許可權才可以訪問相機裝置。
一個給定的相機裝置可以提供兩個級別的支援:有限的或完全的。如果一個裝置只支援有限的級別,那麼攝像頭會公開一個功能集,它大致相當於舊的攝像頭API,不過它的介面更簡潔、更高效。如果是全支援,提供了比舊的攝像頭API更好的功能。針對有限級別裝置的應用程式將在全級裝置上保持不變,而如果應用程式需要一個全級別支援的操作,在manifest中宣告“android.hardware.camera.level.full”的特徵。
該類的常量:
常量名 | 解釋 |
---|---|
TEMPLATE_MANUAL | 一個用於直接應用控制捕獲引數的基本模板。 |
TEMPLATE_PREVIEW | 建立一個適合於相機預覽視窗的請求。 |
TEMPLATE_RECORD | 建立一個適合於視訊錄製的請求。 |
TEMPLATE_STILL_CAPTURE | 建立一個適合於靜態影象捕獲的請求。 |
TEMPLATE_ZERO_SHUTTER_LAG | 建立一個適用於零快門延遲的請求。 |
TEMPLATE_VIDEO_SNAPSHOT | 在錄製視訊時建立一個適合靜態影象捕捉的請求。 |
該常量一般在CameraDevice的createCaptureRequest(int)方法引數中設定。
該類的方法:
返回值 | 方法名 | 解釋 |
---|---|---|
void | close() | 儘可能快地關閉與這個相機裝置的連線。 |
CaptureRequest.Builder | createCaptureRequest(int templateType) | 建立一個CaptureRequest.Builder用於新捕獲請求的,初始化為目標用例的模板。 |
void | createCaptureSession(List Surface outputs, CameraCaptureSession.StateCallback callback, Handler handler) | 通過向相機裝置提供Surfaces的目標輸出集,建立一個新的相機捕捉會話。 |
void | createCaptureSessionByOutputConfigurations(List OutputConfiguration outputConfigurations, CameraCaptureSession.StateCallback callback, Handler handler) | 通過為相機裝置提供表面的目標輸出集和相應的表面配置來建立一個新的相機捕捉會話。 |
void | createConstrainedHighSpeedCaptureSession(List Surface outputs, CameraCaptureSession.StateCallback callback, Handler handler) | 建立一個新的受限的高速捕捉會話。 |
String | getId() | 獲取相機裝置的ID,string型別 |
CameraDevice還一個方法,就不寫在表格中了:
createReprocessableCaptureSessionByConfigurations(InputConfiguration , outputs, CameraCaptureSession.StateCallback, Handler) ,通過為相機裝置提供所需的再處理輸入配置和輸出輸出配置,建立一個新的可重新處理的相機捕捉會話。
<2-1>CameraDevice.StateCallback
CameraDevice的內部類StateCallback,官方文件介紹:
一個回到物件,用於接收關於相機的更新狀態。
一個回撥例項必須先實現CameraManager的openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler) 方法來開啟相機裝置。
這些狀態更新包括關於裝置完成啟動的通知(允許CameraDevice的createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)被呼叫),關於裝置斷開或閉包,以及意外的裝置錯誤。
關於特定的CaptureRequests程序事件是由 CameraCaptureSession.CaptureCallback 提供的,該回調的所有方法見上邊表格。
常量及方法:
返回值 | 常量 | 解釋 |
---|---|---|
int | ERROR_CAMERA_DEVICE | 由CameraDevice.StateCallback的onError(CameraDevice, int)報告的錯誤程式碼,表明相機裝置遇到了一個致命錯誤 |
int | ERROR_CAMERA_DISABLED | 由CameraDevice.StateCallback的onError(CameraDevice, int)報告的錯誤程式碼,這表明由於裝置的政策,相機裝置無法開啟。 |
int | ERROR_CAMERA_IN_USE | 由onError(CameraDevice, int)報告的錯誤程式碼,表明攝像機裝置已經在使用中了 |
int | ERROR_CAMERA_SERVICE | 由onError(CameraDevice, int)報告的錯誤程式碼,表明攝像機服務遇到了一個致命錯誤。 |
int | ERROR_MAX_CAMERAS_IN_USE | 由onError(CameraDevice, int)報告的錯誤程式碼,表明相機裝置無法開啟,因為有太多其他的開放相機裝置。 |
回撥方法 | 解釋 |
---|---|
onClosed(CameraDevice camera) | 當一個相機裝置CameraDevice的close()方法時,這個方法就被呼叫 |
onDisconnected(CameraDevice camera) | 當相機裝置不再可用時,這個方法就被呼叫 |
onError(CameraDevice camera, int error) | 當相機裝置遇到嚴重錯誤時,這種方法就被呼叫了,錯誤見上表的常量 |
onOpened(CameraDevice camera) | 當相機完成開啟操作後,這個方法就被呼叫 |
<3>CameraCaptureSession
文件解釋:
CameraDevice類的一個配置捕捉會話,用於捕捉相機的照片,或者用於之前同一個會話中處理相機捕捉的圖片。
提供一組目標輸出表面給 CameraDevice的createCaptureSession()方法,或者提供一 個InputConfiguration類和為了一個可加工捕捉會話提供一組目標輸出表面給CameraDevice的createReprocessableCaptureSession()方法,就會建立CameraCaptureSession物件,一旦建立CameraCaptureSession,這個會話就處於活動狀態,除非相機又新建一個會話或者裝置關閉。
所有的捕捉會話都可用於從相機捕捉照片,但是隻有可加工捕捉會話在之前同一個會話中可以處理從相機捕捉的照片。
建立一個會話是個昂貴的操作,可以花費零點幾秒時間,因為它需要配置攝像機裝置的內部管道( pipelines),並分配記憶體緩衝區,以便將影象傳送到所需的目標。因此設定非同步操作, CameraDevice的createCaptureSession和createReprocessableCaptureSession方法會將創建出的CameraCaptureSession物件傳送給CameraCaptureSession.StateCallback的onConfigured 回撥方法,如果配置不能完成,就會回撥 onConfigureFailed方法,會話就不能被啟用。
如果一個新的會話被相機建立,name之前的會話就會被關閉,他的關聯回撥CameraCaptureSession.StateCallback的onClosed方法就會被呼叫,如果會話被關閉,所有會話方法都將丟擲IllegalStateException異常。
一個關閉的會話會清除所有重複的操作(就像呼叫CameraCaptureSession的stopRepeating()方法),但是,在新建的會話接管並配置相機前,仍然像正常一樣完成所有的程序捕捉請求。
返回值 | 方法 | 解釋 |
---|---|---|
abortCaptures() | 丟棄當前正在等待和正在進行中的所有捕獲,並儘可能快地完成。 | |
int | capture(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler) | 提交一個影象請求,以便被攝像機裝置捕捉到。 |
int | captureBurst(List requests, CameraCaptureSession.CaptureCallback listener, Handler handler) | 提交一列作為突發事件被捕獲的請求列表。 |
close() | 非同步關閉這個捕獲會話。 | |
finalizeOutputConfigurations(List outputConfigs) | 最後確定輸出配置,這些配置現在包含了它們的延遲和/或額外的表面。 | |
CameraDevice | getDevice() | 獲取這個會話建立的攝像機裝置。 |
Surface | getInputSurface() | 獲取與可重新處理的捕獲會話相關的輸入表面。 |
boolean | isReprocessable() | 如果應用程式可以使用這個攝像機捕捉會話提交可處理的捕獲請求,則返回true。 |
prepare(Surface surface) | 預先為輸出Surface分配所有緩衝區。 | |
int | setRepeatingBurst(List requests, CameraCaptureSession.CaptureCallback listener, Handler handler) | 這個捕獲會話請求不斷地重複捕獲一系列影象。 |
setRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler) | 請求不斷地重複捕捉這個捕獲會話的影象。 | |
stopRepeating() | 取消上邊兩個方法中任意一個的重複捕捉請求 |
<3-1>CameraCaptureSession.CaptureCallback
CameraCaptureSession的內部類CaptureCallback,官方文件解釋:
一個回撥物件,用於跟蹤向相機提交CaptureRequest物件的程序,見下邊的CameraDevice.StateCallback的文件解釋。
這個回撥是在一個請求觸發一個捕獲開始時呼叫的,當捕獲完成時呼叫。如果出現錯誤捕獲影象,則會觸發錯誤方法,而不是完成方法。
重寫的七個方法:
方法 | 解釋 |
---|---|
onCaptureBufferLost(CameraCaptureSession session, CaptureRequest request, Surface target, long frameNumber) | 如果捕獲的單個緩衝區不能傳送到它的目標表面,就會呼叫該方法。 |
onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) | 當一個影象捕捉已經完全完成並且所有的結果元資料都可用時,這個方法就會被呼叫。 |
onCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) | 當相機不能向 CaptureResult 物件提供請求,就會呼叫 |
onCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult) | 當影象捕捉取得部分進展時,就會呼叫該方法;有些(但不是全部)從影象捕獲中得到的結果是可用的。 |
onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId) | 這個方法獨立於CaptureCallback中的其他方法,當捕獲序列在任何CaptureResult或capture失敗之前通過這個偵聽器返回時。 |
onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) | 這個方法獨立於CaptureCallback中的其他方法,當捕獲序列完成後,通過這個偵聽器返回所有的CaptureResult或capture失敗。 |
onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) | 當攝像機裝置開始捕捉請求的輸出影象,在影象曝光開始時,或者當攝像機裝置開始處理一個重新處理請求的輸入影象時,這個方法就被呼叫了。 |
<3-2>CameraCaptureSession.StateCallback
CameraCaptureSession的內部類StateCallback,一個回撥物件,用於接收關於相機捕捉會話狀態的更新。
重寫的七個方法:
方法 | 解釋 |
---|---|
onActive(CameraCaptureSession session) | 當會話開始主動處理捕獲請求時,將呼叫此方法。 |
onCaptureQueueEmpty(CameraCaptureSession session) | 當攝像機裝置的輸入捕捉佇列變為空時,該方法將被呼叫,並準備接受下一個請求。 |
onClosed(CameraCaptureSession session) | 會話關閉觸發 |
onConfigureFailed(CameraCaptureSession session) | 如果會話不能按照請求配置,則呼叫此方法。 |
onConfigured(CameraCaptureSession session) | 當攝像機裝置完成配置時,這個方法就會被呼叫,會話可以開始處理捕獲請求。 |
onReady(CameraCaptureSession session) | 每當會話不再需要處理請求時,就會呼叫此方法。 |
onSurfacePrepared(CameraCaptureSession session, Surface surface) | 當輸出表的緩衝區預分配完成時,就會呼叫該方法。 |
<4>CaptureRequest,CameraCharacteristics,TotalCaptureResult和CaptureResult四個類的區別
這四個類放在一起,是因為他們有共同的欄位列表,都繼承於CameraMetadata,具體的關係如下:
1: CaptureRequest extendsCameraMetadata implements Parcelable
2:CameraCharacteristics extends CameraMetadata
3:TotalCaptureResult extends CaptureResult CameraMetadata
4:CameraMetadata比較單一,放在下邊一節的表格中顯示。
四個類文件解釋
<1>CaptureRequest 官方文件解釋:
一個不可變的設定和輸出,用來從相機裝置捕捉單個影象。
包含捕獲硬體的配置(感測器sensor,、透鏡 lens、閃光燈flash),處理管道pipeline,控制演算法和輸出緩衝區。還包含目標表面的列表,以便將影象資料傳送給該捕獲。
使用CaptureRequest.Builder例項建立CaptureRequests物件,通過呼叫CameraDevice的createCaptureRequest(int templateType) 獲取CaptureRequest.Builder物件。
CaptureRequest物件呼叫CameraCaptureSession的capture(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)或者setRepeatingRequest(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler) 方法從相機捕捉照片。
每個請求都可以指定目標表面的不同子集,以便將捕獲的資料傳送到。當請求被提交到會話時,請求中使用的所有表面都必須是對方法 createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)的最後一次呼叫所給出的地表列表的一部分( All the surfaces used in a request must be part of the surface list given to the last call to createCaptureSession(List, CameraCaptureSession.StateCallback, Handler), when the request is submitted to the session)
例如,一個用於重複預覽的請求可能只包含預覽SurfaceView或SurfaceTexture的表面,而高解析度的靜態捕獲還包括一個用於高解析度JPEG影象的ImageReader的表面。
可處理捕獲請求允許從攝像機裝置獲取以前捕獲的影象,並將其傳送回裝置進行進一步處理。 會話用CameraDevice的createReprocessCaptureRequest(TotalCaptureResult)建立,可修理拍照會話用CameraDevice的createReprocessableCaptureSession(InputConfiguration, List, CameraCaptureSession.StateCallback, Handler)建立.
<2>CameraCharacteristics官方文件解釋:
描述攝像頭裝置的屬性。
這些屬性是給定的攝像頭的屬性,可以通過CameraManager的getCameraCharacteristics(String cameraId) 方法獲取單個攝像頭的CameraCharacteristics物件(個人觀點:通過該物件可以判斷攝像頭都支援什麼功能,比如閃光燈,方向等等)。
CameraCharacteristics物件是不可變的。
<3>TotalCaptureResult官方文件解釋:
從影象感測器捕捉到的單個影象捕獲的全部結果。
包含捕獲硬體的配置(感測器sensor,、透鏡 lens、閃光燈flash),處理管道pipeline,控制演算法和輸出緩衝區。
處理完 CaptureRequest之後,TotalCaptureResult由CameraDevice類產生。所有捕獲請求的屬性列表都可以在捕獲結果中查詢到 ,以確定用於捕獲的最終的值。結果還包括在捕捉期間相機裝置狀態的附加元資料。
getAvailableCaptureResultKeys()返回的所有屬性是可用的(這是get(CaptureResult.Key)方法將返回非空值,當且僅當啟用的關鍵要求)。除非啟用了一個開關(如STATISTICS_FACE_DETECT_MODE),否則在預設情況下,一些關鍵字將被禁用。請參考每個關鍵文件的具體情況。
TotalCaptureResult物件是不可變的。
<4>CaptureResult官方文件解釋:
從影象感測器捕獲單個影象的結果子集。
包含捕獲硬體的配置(感測器sensor,、透鏡 lens、閃光燈flash),處理管道pipeline,控制演算法和輸出緩衝區。
處理完 CaptureRequest之後,CaptureResults由CameraDevice類產生。所有捕獲請求的屬性列表都可以在捕獲結果中查詢到,以確定用於捕獲的最終的值。結果還包括在捕捉期間相機裝置狀態的附加元資料。
不是所有屬性呼叫CameraCharacteristics的getAvailableCaptureResultKeys()返回必然是可用的。一些結果是區域性的(CaptureResult),並且不會有每一個鍵集。只有TotalCaptureResult被保證擁有由請求啟用的所有可用的鍵。
CaptureResult物件是不可變的。
四個類各自獨有的方法和欄位
<1>CaptureRequest
返回值 | 方法 | 解釋 |
---|---|---|
int | describeContents() | 描述這個可分配例項的集合表示中包含的特殊物件的種類。 |
boolean | equals(Object other) | 確定這個CaptureRequest是否等於另一個CaptureRequest。 |
T | get(Key key) | 獲取捕獲請求欄位值。 |
Object | getTag() | |
List> | getKeys() | 返回該map中包含的鍵列表。 |
int | hashCode() | |
boolean | isReprocess() | 確定這是不是一個可加工的捕獲請求。 |
writeToParcel(Parcel dest, int flags) | 把這個物體拉到一個包裹裡。 |
CaptureRequest和CaptureResult的父類欄位,以及所有各自的欄位都是相同的
返回值(public static final ) | 欄位名 | 解釋 |
---|---|---|
Key Boolean | BLACK_LEVEL_LOCK | 黑等級的補償是否被鎖定在當前的值上,或者是自由的變化。 |
Key Integer | COLOR_CORRECTION_ABERRATION_MODE | 色差 |
Key RggbChannelVector | COLOR_CORRECTION_GAINS | 獲得白平衡Bayer的raw color頻道 |
Key Integer | COLOR_CORRECTION_MODE | 模式控制選擇如何將影象資料從感測器的本機顏色轉換為線性sRGB顏色。 |
Key ColorSpaceTransform | COLOR_CORRECTION_TRANSFORM | 一種顏色變換矩陣,用於從感測器RGB顏色空間轉換為輸出線性sRGB色彩空間 |
Key Integer | CONTROL_AE_ANTIBANDING_MODE | 相機裝置的自動曝光演算法的反帶補償的理想設定。 |
Key Integer | CONTROL_AE_EXPOSURE_COMPENSATION | 調整自動曝光(AE)目標影象亮度。 |
Key Integer | CONTROL_AE_LOCK | 是否自動曝光(AE)目前被鎖定在最新的計算值上。 |
Key Integer | CONTROL_AE_MODE | 相機裝置的自動曝光程式所需的模式。 |
Key Integer | CONTROL_AE_PRECAPTURE_TRIGGER | 當它處理這個請求時,攝像機裝置是否會觸發一個預捕獲的測量序列。 |
Key MeteringRectangle[] | CONTROL_AE_REGIONS | 用於自動曝光調整的計量區域表。 |
Key Boolean | CONTROL_AWB_LOCK | 自動白平衡(AWB)是否被鎖定在最新的計算值上。 |
Key Integer | CONTROL_AWB_MODE | 自動白平衡(AWB)是否正在設定顏色轉換欄位,以及它的照明目標是什麼。 |
Key MeteringRectangle[] | CONTROL_AWB_REGIONS | 用於自動平衡光源估計的計量區域的列表。 |
Key Integer | CONTROL_CAPTURE_INTENT | 資訊到相機裝置3A(自動曝光,自動對焦,自動平衡)例程,以幫助相機裝置決定最優的3A策略。 |
Key Integer | CONTROL_EFFECT_MODE | 一種特殊的顏色效果。 |
Key Boolean | CONTROL_ENABLE_ZSL | 允許相機裝置為android.control.captureIntent == STILL_CAPTURE 的請求啟用零樹/延遲模式 |
Key Integer | CONTROL_MODE | 3A的整體模式(自動曝光,自動平衡,自動對焦)控制例程。 |
Key Integer | CONTROL_POST_RAW_SENSITIVITY_BOOST | 在獲取原始感測器資料後,應用於輸出影象的額外靈敏度增加。 |
Key Integer | CONTROL_SCENE_MODE | 控制哪個場景模式當前是活躍的。 |
Key Integer | CONTROL_VIDEO_STABILIZATION_MODE | 視訊穩定是否活躍。 |
Creator CaptureRequest | CREATOR | |
Key Integer | EDGE_MODE | 邊緣增強的操作模式。 |
Key Integer | FLASH_MODE | 快閃記憶體模式 |
Key Integer | HOT_PIXEL_MODE | 熱畫素校正的操作模式。 |
Key Location | JPEG_GPS_LOCATION | 在生成影象GPS元資料時使用的位置物件。 |
Key Integer | JPEG_ORIENTATION | 一個JPEG影象的朝向。 |
Key Byte | JPEG_QUALITY | 最終JPEG影象的壓縮質量 |
Key Size | JPEG_THUMBNAIL_SIZE | 嵌入的JPEG縮圖的解析。 |
Key Float | LENS_APERTURE | 所需的鏡頭光圈大小,作為透鏡焦距與有效孔徑的比值。 |
Key Float | LENS_FILTER_DENSITY | 鏡頭中性密度濾光片(s)所需的設定。 |
Key Float | LENS_FOCAL_LENGTH | 想要的鏡頭焦距;用於光學變焦。 |
Key Float | LENS_FOCUS_DISTANCE | 從鏡頭的最前表面測量到最尖銳焦點的距離。 |
Key Integer | LENS_OPTICAL_STABILIZATION_MODE | 設定相機裝置在拍攝影象時是否使用光學影象穩定(OIS)。 |
Key Integer | NOISE_REDUCTION_MODE | 降噪演算法的操作模式。 |
Key Float | REPROCESS_EFFECTIVE_EXPOSURE_FACTOR | 在進行再加工前,應用處理的應用程式處理的暴露時間增加了。 |
Key Rect | SCALER_CROP_REGION | 感測器所需要的區域來讀取這個捕獲(拍某個形狀的設定) |
Key Long | SENSOR_EXPOSURE_TIME | 持續每一個畫素都暴露在光中。 |
Key Long | SENSOR_FRAME_DURATION | 從幀曝光開始到下一個幀曝光的持續時間。 |
Key Integer | SENSOR_SENSITIVITY | 處理前的感測器資料的增益。 |
Key int[] | SENSOR_TEST_PATTERN_DATA | 當android.sensor.testPatternMode是 SOLID_COLOR,一個pixel[R, G_even, G_odd, B]提供測試模式的畫素 |
Key Integer | SENSOR_TEST_PATTERN_MODE | 當啟用時,感測器會發送一個測試模式,而不是從攝像機中進行真實的曝光。 |
Key Integer | SHADING_MODE | 鏡頭陰影校正的質量應用於影象資料。 |
Key Integer | STATISTICS_FACE_DETECT_MODE | 人臉檢測裝置的工作模式。 |
Key Boolean | STATISTICS_HOT_PIXEL_MAP_MODE | 熱畫素對映生成的操作模式。 |
Key Integer | STATISTICS_LENS_SHADING_MAP_MODE | 攝像機裝置是否會輸出結果元資料中的鏡頭著色圖。 |
Key TonemapCurve | TONEMAP_CURVE | 當android.tonemap.mode 是CONTRAST_CURVE時,使用音調/對比度/伽瑪曲線 |
Key Float | ONEMAP_GAMMA | android.tonemap.mode 是GAMMA_VALUE時,使用Tonemapping曲線。tonemap曲線將定義如下公式:OUT=pow(在1.0/gamma中)輸入的畫素值被縮放到範圍0.0,1.0,pow是能量函式,而伽瑪是這個鍵所指定的伽馬值。 |
Key Integer | TONEMAP_MODE | 高階全球對比/γ/ tonemapping控制。 |
Key Integer | TONEMAP_PRESET_CURVE | android.tonemap.mode 是 PRESET_CURVE時,使用Tonemapping曲線。tonemap曲線將由指定的標準定義。 |
<1-1>CaptureRequest.Builder
CaptureRequest內部類Builder,捕獲請求的構建器。要獲得構建器例項,可以使用CameraDeviced的createCaptureRequest(int)方法,該方法將請求欄位初始化為在CameraDevice定義的一個模板。
返回值(public static final ) | 方法名 | 解釋 |
---|---|---|
addTarget(Surface outputTarget) | 向該請求的目標列表新增一個表面。當請求被髮送給攝像機裝置時,新增的表面必須是最近呼叫createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)方法的一個表面。 | |
CaptureRequest | build() | 使用當前目標表面和設定構建一個請求。 |
T | get(Key key) | 獲取抓捕請求欄位值 |
removeTarget(Surface outputTarget) | 從這個請求的目標列表中刪除一個表面。 | |
set(Key key, T value) | 將捕獲請求欄位設定為一個值 | |
setTag(Object tag) | 為這個請求設定一個標記。 |
常用的方法已加粗,通過CaptureRequest.Builder的set(Key key, T value)方法設定各種引數,比如自動對焦,設定flash,key值就是上面表中CaptureRequest的欄位表,再通過build()方法生成CaptureRequest物件。注意,CaptureRequest繼承於CameraMetadata類,CameraMetadata類的欄位才是相機屬性值的基類。
<2>CameraCharacteristics
返回值 | 方法 | 解釋 |
---|---|---|
T | get(Key key) | 獲取捕獲請求欄位值。 |
List Key | getAvailableCaptureRequestKeys() | 獲取CaptureRequest設定給CameraDevice的鍵值集合 |
List Key | getAvailableCaptureResultKeys() | 獲取CaptureResult設定給CameraDevice的鍵值集合 |
List Key | getKeys() | 獲取map中的鍵值集合 |
返回值(public static final ) | 欄位名 | 解釋 |
---|---|---|
Key int[] | COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES | 異常校正模式 |
Key int[] | CONTROL_AE_AVAILABLE_ANTIBANDING_MODES | 自動曝光反帶模式列表 |
Key int[] | CONTROL_AE_AVAILABLE_MODES | 在自動曝光模式列表 |
Key Range | CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES | 幀速率範圍表 |
Key Rational | CONTROL_AE_COMPENSATION_STEP | 最小的一步,可以改變曝光補償。 |
Key int[] | CONTROL_AF_AVAILABLE_MODES | 自動對焦(AF)列表 |
Key int[] | CONTROL_AVAILABLE_EFFECTS | 色彩效果列表 |
Key int[] | CONTROL_AVAILABLE_MODES | 控制模式列表 |
Key int[] | CONTROL_AVAILABLE_SCENE_MODES | 場景列表模式 |
Key int[] | CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES | 視訊穩定模式列表 |
Key int[] | CONTROL_AWB_AVAILABLE_MODES | 白平衡模式列表 |
Key Boolean | CONTROL_AWB_LOCK_AVAILABLE | 相機裝置支援MANUAL_POST_PROCESSING或BURST_CAPTURE則為true |
Key Integer | CONTROL_MAX_REGIONS_AE |
相關推薦Android camera(8)---Camera2詳解之一 API學習Camera2的API出來有些年頭了,只是趕專案多次使用,沒時間好好總結,年終了,正好結合google的官方Camera2demo 和開發中使用的情況,做個詳細梳理,研究總結之後,才發現Camera2並非想象的難用,充分理解相關幾個類之後,實現自己需求還是很簡單的。該篇詳細介紹Camera2相關的類,根據AP 【轉】Android Camera 相機開發詳解exc troy start 當前 container rac google getconf 對比度 在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口。Camera2在接口和架構上做了巨大的變動, 但是基於眾所周知的原因 Android Camera 相機開發詳解在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera介面。Camera2在介面和架構上做了巨大的變動, 但是基於眾所周知的原因,我們還必須基於 Android 4.+ 系統進行開發。本文介紹的是Camera介面開發及其使 Android面試收集錄8 HandlerThread詳解ast 等待 androi color 們的 pause exceptio 虛擬 tee 1.前言 我們知道在Android系統中,我們執行完耗時操作都要另外開啟子線程來執行,執行完線程以後線程會自動銷毀。 想象一下如果我們在項目中經常要執行耗時操作,如果 3-3.8 Dockerfile 指令詳解之一Dockerfile提供了一種模板檔案形式來建立docker映象的方式,有其特有的指令,本篇詳解其用法。 目錄 FROM 指定基礎映象 RUN 執行命令 COPY 複製檔案 ADD 更高階的複製檔案 CMD 容器啟動命令 ENTRYPOINT 入口點 ENV 設定環境 linux驅動由淺入深系列:PBL-SBL1-(bootloader)LK-Android啟動過程詳解之一(高通MSM8953啟動例項)【轉】本文轉載自:https://blog.csdn.net/radianceblau/article/details/73229005 對於嵌入式工程師瞭解晶片啟動過程是十分有必要的,在分析、除錯各種問題的時候都有可能涉及到這方面的知識。同時這部分知識也是比較複雜的,因為其中涉及到晶片內部架構,啟動各個階段軟體 android.hardware.camera2詳解(實時更新,未完待續...)看到有些讀者對部落格提出的疑問,在此真誠說一句實在抱歉,本人是一名在校非科班出身大學生,之前 由於是期末季,所以非常忙,沒有空更新,一月二十幾號才放假,非常抱歉,評論所訴內容應該都已解決,只是我沒有更新,近期將會更新!再次致歉! 前言:原有的androi Android自定義view詳解this boolean mar 處理 都是 並且 jdk text 命名 從繼承開始 懂點面向對象語言知識的都知道:封裝,繼承和多態,這是面向對象的三個基本特征,所以在自定義View的時候,最簡單的方法就是繼承現有的View 通過上面這段代碼,我定義了一個Ske Android MVC開發框架詳解div ada 2-2 展示 gpo lose 回調接口 cycle recycler 1、目錄根據需要自行添加 adapter 用於RecyclerView、ListView 等各種適配器 fragment 存放fragment model Android Parcel對象詳解行數 ado state on() 直接 之一 一起 sharp mar 關於Parcel的使用 在分析Parcel之前,首先按照分析流程,介紹下關於Parcel的相關常規使用。 首先是關於Parcel的獲取: Parcel parcle = Parcel.Obtain() Android EventBus3.x 使用詳解(一)led AC target 分解 感覺 div activit .org android事 ?(^∇^*) 五一假期在家無事,新項目中用的是RxJava2+EventBus感覺還不錯,趁這閑暇總結下EventBus 一、概要簡述 EventBus 機器學習中的概率模型和概率密度估計方法及VAE生成式模型詳解之一(簡介)價值 新書 The aar 生成 syn TE keras 第一章 A Gentle Introduction to Probabilistic Modeling and Density Estimation in Machine LearningAndA Detailed Android-系統/proc目錄詳解/proc是一個虛擬檔案系統,其下面的檔案不是真實存在的,不佔用實際儲存空間。 /proc/cmdline:顯示核心啟動的命令列。 /proc/cpuinfo:顯示系統cpu的資訊。 /proc/filesystems,顯示當前註冊了的檔案系統列表,nodev表示為虛擬檔案系統。 Android FileProvider 屬性配置詳解及FileProvider多節點問題眾所周知在android7.0,修改了對私有儲存的限制,導致在獲取資源的時候,不能通過Uri.fromFile來獲取uri了我們需要適配7.0+的機型需要這樣寫: 1:程式碼適配 if (Build.VERSION.SDK_INT > 23) {// Android 常用的Context詳解1.Context概述 Context是一個抽象類,其通用實現在ContextImpl類中。它的主要作用是一個訪問application環境全域性資訊的介面,通過它可以訪問application的資源和相關的類,其主要功能如下: 啟動Activity android中wifi原理詳解(轉)二:Wifi模組的初始化:: 在 SystemServer 啟動的時候,會生成一個ConnectivityService的例項, try { Log.i(TAG, "Starting Connectivity Service."); ServiceManager.addService(Con android狀態機statemachine詳解分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!   Android小知識-ActivityManagerService詳解(APP啟動過程)前言 AMS(ActivityManagerService)的啟動是在SystemServer程序中啟動的,它的職責是用於和所有APP的四大元件進行通訊,Activity的啟動過程就是APP端與AMS端進行通訊,首先理解的一點是APP端與AMS是在兩個不同的程序中,因此APP端與AMS是通過跨程序通訊的。 第八課-第三講磁碟及檔案系統管理詳解之一一、磁碟管理(詳細的講解硬碟的原理)機械式硬碟---(cpu,記憶體 是電氣裝置)U盤 光碟 軟盤硬碟出廠前有一次“低階格式化”,劃分磁軌分割槽:建立獨立的檔案系統MBR:Master Booter Record 主引導記錄 0盤面 0磁軌 0扇區 512個位元組,不屬於任何一個作業系統。作業系統不能直接訪問 Android原始碼目錄結構詳解轉自:http://blog.csdn.net/xiangjai/article/details/9012387 在學習Android的過程中,學習寫應用還好,一開始不用管太多程式碼,直接呼叫函式就可以了,但是工作中卻需要修改到framework之類的東東 所以感覺開始糾結了,又是 |