Android API學習之Camera

Camera(已過時)

繼承自Object
java.lang.Object
android.hardware.Camera

類概述

Camera類是用來對捕獲的圖片進行設置,開始/停止預覽,拍照片以及檢索用於視頻編碼的幀。此類是Camera服務的客戶端,用於管理實際的相機硬件

使用相機,你必須在你的AndroidManifest裏面聲明相機權限。並且要確保通過<uses-feature>聲明瞭在你的應用中所要使用的相機功能。例如,如果你需要用到相機的自動聚焦功能,你應該這樣設置:

<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)來獲取一個照相機實例
  2. 通過getParameters()來獲取存在(默認)的設置通過getParameters()來獲取存在(默認)的設置
  3. 如果有必要,可以Camera.Parameters對象並調用setParameters(Camera.Parameters)如果有必要,可以Camera.Parameters對象並調用setParameters(Camera.Parameters)
  4. 如果需要,調用setDisplayOrientation(int)設置展示方向如果需要,調用setDisplayOrientation(int)設置展示方向
  5. 重要:將完成初始化的SurfaceHolder對象傳遞給setPreviewDisplay(SurfaceHolder)。沒有surface,相機將不能預覽。重要:將完成初始化的SurfaceHolder對象傳遞給setPreviewDisplay(SurfaceHolder)。沒有surface,相機將不能預覽。
  6. 重要:調用startPreview()來開始更新預覽的surface。預覽必須在你照相之前啓動。重要:調用startPreview()來開始更新預覽的surface。預覽必須在你照相之前啓動。
  7. 當你想的時候,調用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback,Camera.PictureCallback)來捕獲一張照片。等待回調提供一張真實的圖片數據。當你想的時候,調用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback,Camera.PictureCallback)來捕獲一張照片。等待回調提供一張真實的圖片數據。
  8. 照完一張相後,預覽展示將會停止。要想照更多的照片,需要再一次調用startPreview()照完一張相後,預覽展示將會停止。要想照更多的照片,需要再一次調用startPreview()
  9. 調用stopPreview()來停止更新預覽suface調用stopPreview()來停止更新預覽suface
  10. 重要:調用release()來釋放相機資源。在onPause()裏釋放,在onResume()裏重新打開。 重要:調用release()來釋放相機資源。在onPause()裏釋放,在onResume()裏重新打開。

要快速切換到視頻錄製模式,請使用以下步驟:

  1. 像上述步驟一樣獲取和聲明一個Camera對象並啓動預覽。
  2. 調用unlock()來允許多媒體進程可以使用相機調用unlock()來允許多媒體進程可以使用相機
  3. 通過相機的setCamera(Camera)來設置相機。關於視頻錄製參見MediaRecoder信息。通過相機的setCamera(Camera)來設置相機。關於視頻錄製參見MediaRecoder信息。
  4. 當完成錄製,調用reconnect()來重新獲取並重新鎖定相機當完成錄製,調用reconnect()來重新獲取並重新鎖定相機
  5. 如果需要,重新開始預覽並拍攝更多照片或者錄製更多視頻如果需要,重新開始預覽並拍攝更多照片或者錄製更多視頻
  6. 調用stopPreview()和release()調用stopPreview()和release()

這個類不是線程安全的,適用於一個事件線程。大多數長時間運行的操作(預覽,焦點,照片捕獲等)都是異步發生的,並在必要時調用回調。將會在調用open(int)時進行回調。這個類必須保證沒有被其它線程調用。(也就是說,同一個進程裏同時只能有一個線程調用open(int));

<font color=red>注意:不同的Android設備可能具有不同的硬件規格,例如百萬像素評級和自動對焦功能。 爲了使您的應用程序與更多設備兼容,老老實實按照api來。</font>

開發者指南

對於相機的更多使用方法,請閱讀相機的開發者指南

摘要

嵌套類

class Camera.Area Area類用於選擇計算自動曝光,自動白平衡和自動對焦時相機使用的特定測光和對焦區域。
interface Camera.AutoFocusCallback 回調接口用於在完成相機自動對焦時通知。
interface Camera.AutoFocusMoveCallback 回調接口用於通知自動對焦開始和停止。
class Camera.CameraInfo 相機的信息
interface Camera.ErrorCallback 用於攝像機錯誤通知的回調接口。
class Camera.Face 通過相機面部檢測識別的面部信息。
interface Camera.FaceDetectionListener 在預覽框中檢測到面部的回調界面。
interface Camera.OnZoomChangeListener 平滑的縮放操作過程中縮放改變的回調接口
class Camera.Parameters 相機服務設置
interface Camera.PictureCallback 用於從照片裏提取圖像數據的回調接口
interface Camera.PreviewCallback 圖片展示時用於提供幀的副本的回調接口
interface Camera.ShutterCallback 真實圖片捕獲時的回調接口
class Camera.Size 圖片尺寸(高度和寬度)

常量

String ACTION_NEW_PICTURE 廣播操作:攝像機拍攝新照片,並且照片的輸入已添加到媒體存儲中。
String ACTION_NEW_VIDEO 廣播操作:攝像機錄製新視頻,視頻條目已添加到媒體存儲中。
int CAMERA_ERROR_SERVER_DIED 多媒體服務掛掉了
int CAMERA_ERROR_UNKOWN 未知的相機錯誤

公共方法

final void addCallbackBuffer(byte[] callbackBuffer) 將預分配的緩衝區添加到預覽回調緩衝區隊列。
final void autoFocus(Camera.AutoFocusCallback cb) 啓動相機自動對焦並註冊回調功能,以便在相機對焦時運行。
final void cancelAutoFocus() 取消正在進行的所有自動對焦功能
final boolean enableShutterSound(boolean enabled) 拍照時啓用或禁用默認快門聲音。
static void getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo) 返回有關特定攝像機的信息。
static int getNumberOfCameras() 返回此設備上可用的物理攝像機數量。
Camera.Parameters getParameters() 返回此Camera服務的當前設置。
final void lock() 重新鎖定相機以防止其他進程訪問它。
static Camera open(int cameraId) 創建一個新的Camera對象以訪問特定的硬件攝像頭。
static Camera open() 創建一個新的Camera對象以訪問設備上的第一個後置攝像頭。
final void reconnect() 在另一個進程使用後重新連接到攝像頭服務。
final void release() 斷開並釋放Camera對象資源。
void setAutoFocusMoveCallback(Camera.AutoFocusMoveCallback cb) 設置相機自動對焦移動回調。
final void setDisplayOrientation(int degrees) 以度爲單位設置預覽顯示的順時針旋轉。
final void setErrorCallback(Camera.ErrorCallback cb) 註冊發生錯誤時要調用的回調。
final void setFaceDetectionListener(Camera.FaceDetectionListener listener) 註冊一個監聽器對面部檢測進行監聽
final void setOneShotPreviewCallback(Camera.PreviewCallback cb) 除了在屏幕上顯示之外,還安裝要爲下一個預覽幀調用的回調。
void setParameters(Camera.Parameters params) 更改此Camera服務的設置。
final void setPreviewCallback(Camera.PreviewCallback cb) 除了在屏幕上顯示之外,還爲每個預覽幀安裝要調用的回調。
final void setPreviewCallbackWithBuffer(Camera.PreviewCallback cb) 除了在屏幕上顯示之外,還使用addCallbackBuffer(byte [])提供的緩衝區爲每個預覽幀安裝要調用的回調。
final void setPreviewDisplay(SurfaceHolder holder) 設置要用於實時預覽的Surface。
final void setZoomChangeListener(Camera.OnZoomChangeListener listener) 在平滑縮放期間,當攝像機驅動程序更新縮放值時,註冊監聽器以通知。
final void startFaceDetection() 開始面部檢測
final void startPreview() 開始捕獲並將預覽幀繪製到屏幕上。
final void startSmoothZoom(int value) 平滑地縮放到要求的值。
final void stopFaceDetection() 停止面部檢測
final void stopPreview() 停止捕獲並將預覽幀繪製到曲面,並重置相機以便將來調用startPreview()。
final void stopSmoothZoom() 停止平滑縮放
final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg) 相當於 takePicture(shutter, raw, null, jpeg).
final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg) 觸發異步圖像捕獲。
final void unlock() 解鎖相機以允許其他進程訪問它。
受保護的方法
void finalize() 當垃圾收集器檢測到此實例不再可訪問時調用。

繼承的方法

Object clone() 創建並返回此Object的副本。
boolean equals(Object o) 將此實例與指定對象進行比較,並指示它們是否相等。
void finalize() 當垃圾收集器檢測到此實例不再可訪問時調用。
final Class<?> getClass() 返回表示此對象類的Class的唯一實例。
int hashCode() 返回此對象的整數哈希代碼。
final void notify() 導致正在等待此對象監視器的線程(通過調用其中一個wait()方法)被喚醒。
final void notifyAll() 導致等待此對象監視器的所有線程(通過調用其中一個wait()方法)被喚醒。
String toString() 返回一個字符串,其中包含此對象的簡潔,可讀的描述。
final void wait() 使調用線程等待,直到另一個線程調用此對象的notify()或notifyAll()方法。
final void wait(long millis, int nanos) 使調用線程等待,直到另一個線程調用此對象的notify()或notifyAll()方法,或者直到指定的超時到期爲止。
final void wait(long millis) 使調用線程等待,直到另一個線程調用此對象的notify()或notifyAll()方法,或者直到指定的超時到期爲止。

public static final String ACTION_NEW_PICTURE

廣播操作: 攝像機拍攝新照片,並且照片的輸入已添加到媒體存儲中。 getData()是圖片的URI。
常量值:"android.hardware.action.NEW_PICTURE"

public static final String ACTION_NEW_VIDEO

廣播操作: 攝像機錄製新視頻,視頻條目已添加到媒體存儲中。 getData()是視頻的URI。
常量值:"android.hardware.action.NEW_VIDEO"

public static final int CAMERA_ERROR_SERVER_DIED

媒體服務器死了。 在這種情況下,應用程序必須釋放Camera對象並實例化一個新對象。
也可以參考: Camera.ErrorCallback
常量值: 100 (0x00000064)

public static final int CAMERA_ERROR_UNKNOWN

未指定的相機錯誤。
也可以參考: Camera.ErrorCallback
常量值: 1 (0x00000001)

公共方法

public final void addCallbackBuffer(byte[] callbackBuffer)

將預分配的緩衝區添加到預覽回調緩衝區隊列。 應用程序可以向隊列添加一個或多個緩衝區。 當預覽幀到達並且仍然存在至少一個可用緩衝區時,將使用緩衝區並從隊列中刪除緩衝區。 然後使用緩衝區調用預覽回調。 如果幀到達並且沒有剩餘緩衝區,則丟棄該幀。 應用程序應在完成處理數據時添加緩衝區。
對於除YV12之外的格式,緩衝區的大小通過將預覽圖像寬度,高度和每像素字節相乘來確定。 可以從getPreviewSize()讀取寬度和高度。 可以使用getPreviewFormat()中的圖像格式用getBitsPerPixel(int)/ 8計算每像素的字節數。
如果使用YV12格式,則可以使用setPreviewFormat(int)中列出的公式計算大小。
只有在使用setPreviewCallbackWithBuffer(PreviewCallback)時才需要此方法。 使用setPreviewCallback(PreviewCallback)或setOneShotPreviewCallback(PreviewCallback)時,會自動分配緩衝區。 當提供的緩衝區太小而無法保存預覽幀數據時,預覽回調將返回null,緩衝區將從緩衝區隊列中刪除。

參數
callbackBuffer:要添加到隊列的緩衝區。 緩衝區的大小必須與上述值匹配。
可以參考
setPreviewCallbackWithBuffer(PreviewCallback)

public final void autoFocus (Camera.AutoFocusCallback cb)

啓動相機自動對焦並註冊回調功能,以便在相機對焦時運行。 此方法僅在預覽處於活動狀態時(startPreview()和stopPreview()之前)有效。
調用者應該檢查getFocusMode()以確定是否應該調用此方法。 如果相機不支持自動對焦,則會立即調用no-op和onAutoFocus(boolean,Camera)回調。
如果您的應用程序不應安裝在沒有自動對焦的設備上,則必須聲明您的應用程序使用<uses-feature>清單元素進行自動對焦。
如果當前閃光模式不是FLASH_MODE_OFF,則在自動對焦期間可能會閃光,具體取決於驅動程序和相機硬件。
自動曝光鎖定getAutoExposureLock()和自動白平衡鎖定getAutoWhiteBalanceLock()在自動對焦期間和之後不會更改。 但自動對焦程序可能會在對焦過程中暫時停止自動曝光和自動白平衡。
使用stopPreview()停止預覽,或使用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback)觸發靜止圖像捕獲,不會更改焦點位置。 應用程序必須調用cancelAutoFocus來重置焦點。
如果自動對焦成功,請考慮使用MediaActionSound向用戶正確播放自動對焦成功聲音。

參數
cb:回調運行
可以參考
cancelAutoFocus()
setAutoExposureLock(boolean)
setAutoWhiteBalanceLock(boolean)
MediaActionSound

public final void cancelAutoFocus ()

取消正在進行的任何自動對焦功能。 無論當前是否正在進行自動對焦,此功能都會將焦點位置恢復爲默認值。 如果相機不支持自動對焦,這是一個無操作。

可以參考
autoFocus(Camera.AutoFocusCallback)

public final boolean enableShutterSound (boolean enabled)

拍照時啓用或禁用默認快門聲音。
默認情況下,當調用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback)時,相機會播放系統定義的相機快門聲音。 使用此方法,可以禁用快門聲音。 當系統快門聲音被禁用時,強烈建議在Camera.ShutterCallback中播放替代快門聲。
請注意,設備可能無法始終禁用相機快門聲音。 如果快門聲音狀態不能設置爲所需的值,則此方法將返回false。 canDisableShutterSound可用於確定設備是否允許禁用快門聲音。

參數
enabled:調用takePicture時相機是否應播放系統快門聲音。
返回
如果快門聲音狀態成功更改,則爲true。 如果無法更改快門聲音狀態,則爲false。 如果快門聲音播放已設置爲請求狀態,也會返回true。
可以參考
takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback)
canDisableShutterSound
Camera.ShutterCallback

public static void getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo)

返回有關特定攝像機的信息。 如果getNumberOfCameras()返回N,則有效id爲0到N-1。
public static int getNumberOfCameras()
返回此設備上可用的物理攝像機數量。

public Camera.ParametersgetParameters()

返回此Camera服務的當前設置。 如果對返回的參數進行了修改,則必須將它們傳遞給setParameters(Camera.Parameters)才能生效

可以參考
setParameters(Camera.Parameters)

public final void lock()

重新鎖定相機以防止其他進程訪問它。 除非調用unlock(),否則默認情況下會鎖定相機對象。 通常使用reconnect()代替。
從API級別14開始,相機會在start()中自動鎖定應用程序。 應用程序可以在錄製開始後使用相機(例如:縮放)。 錄製開始或停止後無需呼叫。
如果您不錄製視頻,則可能不需要此方法。

拋異常
RuntimeException:如果相機無法重新鎖定(例如,如果相機仍在使用其他過程)。

public static Cameraopen(int cameraId)

創建一個新的Camera對象以訪問特定的硬件攝像頭。 如果其他應用程序打開了同一個攝像頭,則會拋出RuntimeException。
使用完相機後必須調用release(),否則它將保持鎖定狀態並且對其他應用程序不可用。
您的應用程序一次只能爲一個特定的硬件攝像頭激活一個Camera對象。
來自其他方法的回調被傳遞到調用open()的線程的事件循環。 如果此線程沒有事件循環,則回調將傳遞到主應用程序事件循環。 如果沒有主應用程序事件循環,則不會傳遞迴調。
注意:在某些設備上,此方法可能需要很長時間才能完成。 最好從工作線程(可能使用AsyncTask)調用此方法,以避免阻塞主應用程序UI線程。

參數
cameraId:要訪問的硬件攝像頭,介於0和getNumberOfCameras() - 1之間。
返回
一個新的Camera對象,已連接,鎖定並可供使用。
拋異常
RuntimeException:如果打開相機失敗(例如,如果相機正由另一個進程使用或設備策略管理器已禁用相機)。
可以參考
open(int)

public final void reconnect()

在另一個進程使用後重新連接到攝像頭服務。 調用unlock()後,另一個進程可能會使用相機; 完成此過程後,您必須重新連接相機,重新獲取鎖定並允許您繼續使用相機。
從API級別14開始,相機會在start()中自動鎖定應用程序。 應用程序可以在錄製開始後使用相機(例如:縮放)。 錄製開始或停止後無需調用。
如果您不錄製視頻,則可能不需要此方法。

拋異常
IOException:如果無法重新建立連接(例如,如果相機仍在由另一個進程使用)。

public final void release()

斷開並釋放Camera對象資源。
完成Camera對象後,必須立即調用此方法。

public void setAutoFocusMoveCallback(Camera.AutoFocusMoveCallback cb)

以度爲單位設置預覽顯示的順時針旋轉。 這會影響預覽幀和快照後顯示的圖片。 此方法對縱向模式應用程序很有用。 請注意,前置攝像頭的預覽顯示在旋轉之前水平翻轉,即圖像沿着攝像頭傳感器的中心垂直軸反射。 因此,用戶可以將自己當做正在照鏡子。
這不會影響onPreviewFrame(byte [],Camera),JPEG圖片或錄製視頻中傳遞的字節數組的順序。 在預覽期間不允許調用此方法。
如果要使攝像機圖像以與顯示屏相同的方向顯示,可以使用以下代碼。

public static void setCameraDisplayOrientation(Activity activity,
             int cameraId, android.hardware.Camera camera) {
         android.hardware.Camera.CameraInfo info =
                 new android.hardware.Camera.CameraInfo();
         android.hardware.Camera.getCameraInfo(cameraId, info);
         int rotation = activity.getWindowManager().getDefaultDisplay()
                 .getRotation();
         int degrees = 0;
         switch (rotation) {
             case Surface.ROTATION_0: degrees = 0; break;
             case Surface.ROTATION_90: degrees = 90; break;
             case Surface.ROTATION_180: degrees = 180; break;
             case Surface.ROTATION_270: degrees = 270; break;
         }
    ​
         int result;
         if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
             result = (info.orientation + degrees) % 360;
             result = (360 - result) % 360;  // compensate the mirror
         } else {  // back-facing
             result = (info.orientation - degrees + 360) % 360;
         }
         camera.setDisplayOrientation(result);
     }

從API級別14開始,可以在預覽處於活動狀態時調用此方法。
參數
degrees:圖片順時針旋轉的角度。 有效值爲0,90,180和270.起始位置爲0(橫向)。

可以參考
setPreviewDisplay(SurfaceHolder)

public final void setErrorCallback(Camera.ErrorCallback cb)

註冊發生錯誤時要調用的回調。

參數
cb :要運行的回調

public final void setFaceDetectionListener(Camera.FaceDetectionListener listener)

面部檢測的監聽事件

參數
listener:面部檢測的監聽器
可以參考
startFaceDetection()

public final void setOneShotPreviewCallback(Camera.PreviewCallback cb)

除了在屏幕上顯示之外,還安裝要爲下一個預覽幀調用的回調。 一次調用後,將清除回調。 即使預覽是實時的,也可以隨時調用此方法。 覆蓋任何其他預覽回調。
如果您使用預覽數據創建視頻或靜止圖像,請強烈考慮使用MediaActionSound正確指示圖像捕獲或向用戶錄製開始/停止。

參數
cb:一個回調對象,它接收下一個預覽幀的副本,或者爲null以停止接收回調。
可以參考
MediaActionSound

public void setParameters(Camera.Parameters params)

爲相機服務更改設置

參數
params:相機服務的參數
拋異常
RuntimeException:如果任何參數無效或不受支持。
可以參考
getParameters()

public final void setPreviewCallback(Camera.PreviewCallback cb)

除了在屏幕上顯示之外,還爲每個預覽幀安裝要調用的回調。 只要預覽處於活動狀態,就會重複調用回調。 即使預覽是實時的,也可以隨時調用此方法。 覆蓋任何其他預覽回調。
如果您使用預覽數據創建視頻或靜止圖像,請強烈考慮使用MediaActionSound正確指示圖像捕獲或向用戶錄製開始/停止。

參數
cb:一個回調對象,它接收每個預覽幀的副本,或者爲null以停止接收回調。
可以參考
MediaActionSound

public final void setPreviewCallbackWithBuffer(Camera.PreviewCallback cb)

除了在屏幕上顯示之外,還使用addCallbackBuffer(byte [])提供的緩衝區爲每個預覽幀安裝要調用的回調。 只要預覽處於活動狀態且緩衝區可用,就會重複調用回調。 覆蓋任何其他預覽回調。
此方法的目的是通過允許預覽幀存儲器重用來提高預覽效率和幀速率。 您必須在某個時刻調用addCallbackBuffer(byte []) - 在調用此方法之前或之後 - 或者不會收到回調。
如果使用null回調調用此方法,調用setPreviewCallback(Camera.PreviewCallback)或調用setOneShotPreviewCallback(Camera.PreviewCallback),則將清除緩衝區隊列。
如果您使用預覽數據創建視頻或靜止圖像,請強烈考慮使用MediaActionSound正確指示圖像捕獲或向用戶錄製開始/停止。

參數
cb:接收預覽幀副本的回調對象,或返回null以停止接收回調並清除緩衝區隊列。
可以參考
addCallbackBuffer(byte[])
MediaActionSound

public final void setPreviewDisplay(SurfaceHolder holder)

設置要用於實時預覽的Surface。 預覽需要表面或表面紋理,拍攝時需要預覽。 可以重新設置相同的表面而不會造成傷害。 設置預覽曲面將取消設置通過setPreviewTexture(SurfaceTexture)設置的任何預覽曲面紋理。
調用此方法時,SurfaceHolder必須已包含曲面。 如果您使用的是SurfaceView,則需要在調用setPreviewDisplay()或開始預覽之前使用addCallback(SurfaceHolder.Callback)註冊SurfaceHolder.Callback並等待surfaceCreated(SurfaceHolder)。
必須在startPreview()之前調用此方法。 一個例外是,如果在調用startPreview()之前未設置預覽表面(或設置爲null),則可以使用非null參數調用此方法一次以設置預覽表面。 (這允許相機設置和曲面創建並行發生,節省時間。)預覽曲面在預覽運行時可能不會改變。

參數
holder :包含要放置預覽的Surface,或null以刪除預覽曲面
拋異常
IOException:如果方法失敗(例如,如果表面不可用或不合適)。

public final void setPreviewTexture(SurfaceTexture surfaceTexture)

設置SurfaceTexture以用於實時預覽。 預覽需要表面或表面紋理,拍攝時需要預覽。 可以重新設置相同的表面紋理而不會造成傷害。 設置預覽曲面紋理將取消設置通過setPreviewDisplay(SurfaceHolder)設置的任何預覽曲面。
必須在startPreview()之前調用此方法。 一個例外是,如果在調用startPreview()之前未設置(或設置爲null)預覽表面紋理,則可以使用非null參數調用此方法一次以設置預覽表面。 (這允許相機設置和曲面創建並行發生,節省時間。)預覽曲面紋理在預覽運行時可能不會改變。
由設置爲預覽紋理的SurfaceTexture的getTimestamp()提供的時間戳具有未指定的零點,並且不能在不同相機或同一相機的不同實例之間或在同一程序的多次運行之間直接比較。
如果您使用預覽數據創建視頻或靜止圖像,請強烈考慮使用MediaActionSound正確指示圖像捕獲或向用戶錄製開始/停止。

參數
surfaceTexture:要將預覽圖像發送到的SurfaceTexture,或爲null以刪除當前預覽表面紋理
拋異常
IOException:如果方法失敗(例如,如果表面紋理不可用或不適合)。
可以參考
MediaActionSound
SurfaceTexture
TextureView

public final void setZoomChangeListener(Camera.OnZoomChangeListener listener)

在平滑縮放期間,當攝像機驅動程序更新縮放值時,註冊監聽器以通知。

參數
listener:縮放監聽
可以參考
startSmoothZoom(int)

public final void startFaceDetection()

開始面部檢測。 這應該在預覽開始後調用。 攝像機將通知Camera.FaceDetectionListener預覽幀中檢測到的面部。 檢測到的面部可以與先前的面部相同。 應用程序應調用stopFaceDetection()來停止面部檢測。 如果getMaxNumDetectedFaces()返回大於0的數字,則支持此方法。如果面部檢測已啓動,則應用程序不應再次調用此方法。
當面部檢測正在運行時,setWhiteBalance(String),setFocusAreas(List)和setMeteringAreas(List)無效。 相機使用檢測到的臉部進行自動白平衡,自動曝光和自動對焦。
如果應用程序調用autoFocus(AutoFocusCallback),相機將停止發送面部回調。 最後一個面部回調指示用於執行自動對焦的區域。 焦點完成後,人臉檢測將恢復發送面部回調。 如果應用程序調用cancelAutoFocus(),則面部回調也將恢復。
在調用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback)或stopPreview(),然後使用startPreview()恢復預覽後,應用程序應再次調用此方法以恢復面部檢測。

拋異常
IllegalArgumentException:如果不支持面部檢測。
RuntimeException:如果方法失敗或面部檢測已在運行。
可以參考
Camera.FaceDetectionListener
stopFaceDetection()
getMaxNumDetectedFaces()

public final void startPreview()

開始捕獲並將預覽幀繪製到屏幕上。 在使用setPreviewDisplay(SurfaceHolder)或setPreviewTexture(SurfaceTexture)提供曲面之前,預覽實際上不會開始。如果調用setPreviewCallback(Camera.PreviewCallback),setOneShotPreviewCallback(Camera.PreviewCallback)或setPreviewCallbackWithBuffer(Camera.PreviewCallback),則在預覽數據可用時將調用onPreviewFrame(byte [],Camera)。

public final void startSmoothZoom(int value)

時是否停止縮放。 例如,假設當前縮放爲0並且使用值3調用startSmoothZoom。將使用縮放值1,2和3調用onZoomChange(int,boolean,Camera)方法三次。應用程序可以調用stopSmoothZoom()來停止 變焦更早。 應用程序不應再次調用startSmoothZoom或在縮放停止前更改縮放值。 如果提供的縮放值等於當前縮放值,則不會生成縮放回調。 如果isSmoothZoomSupported()返回true,則支持此方法。

參數
value:縮放值。值的範圍爲0到 getMaxZoom().
拋異常
IllegalArgumentException:如果不允許縮放
RuntimeException:方法失敗
可以參考
setZoomChangeListener(OnZoomChangeListener)

public final void stopFaceDetection()

停止面部檢測

可以參考
startFaceDetection()

public final void stopPreview()

停止捕獲並將預覽幀繪製到曲面,並重置相機以便將來調用startPreview()。

public final void stopSmoothZoom()

停止平滑縮放。 應用程序應等待Camera.On Zoom Change Listener知道縮放實際停止的時間。 如果isSmoothZoomSupported()爲true,則支持此方法。

拋異常
RuntimeException:如果方法失敗

public final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)

相當於takePicture(shutter, raw, null, jpeg).

可以參考
takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback)

public final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg)

觸發異步圖像捕獲。 隨着圖像捕獲的進行,相機服務將啓動對應用程序的一系列回調。 捕獲圖像後發生快門回調。 這可以用於觸發聲音以讓用戶知道已捕獲圖像。 原始圖像數據可用時發生原始回調(注意:如果沒有可用的原始圖像回調緩衝區或原始圖像回調緩衝區不足以容納原始圖像,則數據將爲null)。 當縮放的,完全處理的postview圖像可用時,會發生postview回調(注意:並非所有硬件都支持此功能)。 當壓縮圖像可用時,將發生jpeg回調。 如果應用程序不需要特定的回調,則可以傳遞null而不是回調方法。
此方法僅在預覽處於活動狀態時(startPreview()之後)有效。 拍攝圖像後將停止預覽; 如果呼叫者想要重新開始預覽或拍攝更多照片,則必須再次調用startPreview()。 不應在start()和stop()之間調用它。
調用此方法後,在返回JPEG回調之前,不得調用startPreview()或拍攝另一張照片。

參數
shutter:圖像捕獲時刻的回調,或者爲null
raw:原始(未壓縮)圖像數據的回調,或null
postview:具有postview圖像數據的回調可以爲null
jpeg:JPEG圖像數據的回調,或null

public final void unlock()

解鎖相機以允許其他進程訪問它。 通常,攝像機使用活動的Camera對象鎖定到進程,直到調用release()。 爲了允許進程之間的快速切換,您可以調用此方法暫時釋放相機以供其他進程使用; 完成其他過程後,您可以調用reconnect()來回收相機。
這必須在調用setCamera(Camera)之前完成。 錄製開始後無法調用此項。
如果您不錄製視頻,則可能不需要此方法。

拋異常
RuntimeException:如果相機無法解鎖。

受保護的方法

protected void finalize()

當垃圾收集器檢測到此實例不再可訪問時調用。 默認實現不執行任何操作,但可以重寫此方法以釋放資源。
請注意,覆蓋最終化的對象比不這樣做的對象要貴得多。 在對象不再可達之後,終結器可能會運行很長時間,具體取決於內存壓力,所以依靠它們進行清理是個壞主意。 另請注意,終結器在單個VM範圍的終結器線程上運行,因此在終結器中執行阻塞工作是個壞主意。 終結器通常僅對具有本機對等體並且需要調用本機方法來銷燬該對等體的類是必需的。 即使這樣,最好提供一個顯式的close方法(並實現Closeable),並堅持讓調用者手動處理實例。 這適用於像文件這樣的東西,但對於像BigInteger這樣的東西不太好,典型的調用代碼必須處理大量的臨時代碼。 不幸的是,從單個終結器線程的角度來看,創建大量臨時代碼的代碼是最糟糕的代碼。
如果必須使用終結器,請考慮至少提供自己的ReferenceQueue並讓自己的線程處理該隊列。
與構造函數不同,終結器不會自動鏈接。 您有責任自己調用super.finalize()。
終結器拋出的未捕獲異常將被忽略,並且不會終止終結器線程。 有關更多信息,請參閱Effective Java Item 7,“避免終結器”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章