Camera(已过时)
继承自Object
java.lang.Object
android.hardware.Camera
类概述
Camera类是用来对捕获的图片进行设置,开始/停止预览,拍照片以及检索用于视频编码的帧。此类是Camera服务的客户端,用于管理实际的相机硬件
使用相机,你必须在你的AndroidManifest里面声明相机权限。并且要确保通过
更改返回的使用这个类来实现照相功能,你需要以下几步:
- 通过open(int)来获取一个照相机实例
- 通过getParameters()来获取存在(默认)的设置通过getParameters()来获取存在(默认)的设置
- 如果有必要,可以Camera.Parameters对象并调用setParameters(Camera.Parameters)如果有必要,可以Camera.Parameters对象并调用setParameters(Camera.Parameters)
- 如果需要,调用setDisplayOrientation(int)设置展示方向如果需要,调用setDisplayOrientation(int)设置展示方向
- 重要:将完成初始化的SurfaceHolder对象传递给setPreviewDisplay(SurfaceHolder)。没有surface,相机将不能预览。重要:将完成初始化的SurfaceHolder对象传递给setPreviewDisplay(SurfaceHolder)。没有surface,相机将不能预览。
- 重要:调用startPreview()来开始更新预览的surface。预览必须在你照相之前启动。重要:调用startPreview()来开始更新预览的surface。预览必须在你照相之前启动。
- 当你想的时候,调用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback,Camera.PictureCallback)来捕获一张照片。等待回调提供一张真实的图片数据。当你想的时候,调用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback,Camera.PictureCallback)来捕获一张照片。等待回调提供一张真实的图片数据。
- 照完一张相后,预览展示将会停止。要想照更多的照片,需要再一次调用startPreview()照完一张相后,预览展示将会停止。要想照更多的照片,需要再一次调用startPreview()
- 调用stopPreview()来停止更新预览suface调用stopPreview()来停止更新预览suface
- 重要:调用release()来释放相机资源。在onPause()里释放,在onResume()里重新打开。 重要:调用release()来释放相机资源。在onPause()里释放,在onResume()里重新打开。
要快速切换到视频录制模式,请使用以下步骤:
- 像上述步骤一样获取和声明一个Camera对象并启动预览。
- 调用unlock()来允许多媒体进程可以使用相机调用unlock()来允许多媒体进程可以使用相机
- 通过相机的setCamera(Camera)来设置相机。关于视频录制参见MediaRecoder信息。通过相机的setCamera(Camera)来设置相机。关于视频录制参见MediaRecoder信息。
- 当完成录制,调用reconnect()来重新获取并重新锁定相机当完成录制,调用reconnect()来重新获取并重新锁定相机
- 如果需要,重新开始预览并拍摄更多照片或者录制更多视频如果需要,重新开始预览并拍摄更多照片或者录制更多视频
- 调用stopPreview()和release()调用stopPreview()和release()
这个类不是线程安全的,适用于一个事件线程。大多数长时间运行的操作(预览,焦点,照片捕获等)都是异步发生的,并在必要时调用回调。将会在调用open(int)时进行回调。这个类必须保证没有被其它线程调用。(也就是说,同一个进程里同时只能有一个线程调用open(int));
注意:不同的Android设备可能具有不同的硬件规格,例如百万像素评级和自动对焦功能。 为了使您的应用程序与更多设备兼容,老老实实按照api来。
开发者指南
对于相机的更多使用方法,请阅读相机的开发者指南
摘要
嵌套类
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)回调。
如果您的应用程序不应安装在没有自动对焦的设备上,则必须声明您的应用程序使用清单元素进行自动对焦。
如果当前闪光模式不是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,“避免终结器”。