pub struct Camera { /* private fields */ }
Expand description
Camera类用于设置图像捕获设置,开始/停止预览,拍摄照片,并检索用于编码的视频帧。 此类是Camera服务的客户端,该服务管理实际的相机硬件。
要访问设备相机,您必须在Android清单中声明android.Manifest.permission#CAMERA权限。还要确保包含
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
使用此类拍照的步骤如下:
- 从open(int)获取Camera实例。
- 使用getParameters()获取现有(默认)设置。
- 如果需要,修改返回的Camera.Parameters对象并调用setParameters(Camera.Parameters)。
- 调用setDisplayOrientation(int)以确保预览的正确方向。
- 重要:将完全初始化的SurfaceHolder传递给setPreviewDisplay(SurfaceHolder)。没有表面,相机将无法启动预览。
- 重要:调用startPreview()以开始更新预览表面。在拍照之前必须先启动预览。
- 当您想拍照时,调用takePicture(Camera.ShutterCallback,Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)来捕获照片。等待回调提供实际图像数据。
- 拍照后,预览显示将停止。要拍摄更多照片,请先调用startPreview()。
- 调用stopPreview()停止更新预览表面。
- 重要:调用release()释放相机供其他应用程序使用。应用程序应在android.app.Activity#onPause()中立即释放相机(并在android.app.Activity#onResume()中重新open())。
要快速切换到视频录制模式,请使用以下步骤:
- 获取并初始化Camera并启动预览,如上所述。
- 调用unlock()允许媒体进程访问相机。
- 将相机传递给android.media.MediaRecorder#setCamera(Camera)。有关视频录制的更多信息,请参阅android.media.MediaRecorder。
- 完成录制后,调用reconnect()重新获取并锁定相机。
- 如果需要,重新启动预览并拍摄更多照片或视频。
- 调用stopPreview()和release(),如上所述。
此类不是线程安全的,旨在从单个事件线程使用。大多数长时间运行的操作(预览、对焦、拍照等)都是异步执行的,并在必要时调用回调。 回调将在open(int)被调用的事件线程上调用。此类的方法绝不能同时从多个线程调用。
注意: 不同的Android设备可能具有不同的硬件规格,例如百万像素评级和对焦能力。为了使您的应用程序与更多设备兼容,您不应对设备相机规格做出假设。
开发者指南< 有关使用相机的更多信息,请阅读开发者指南。
Implementations§
Source§impl Camera
impl Camera
Sourcepub const CAMERA_ERROR_UNKNOWN: i32 = 1i32
pub const CAMERA_ERROR_UNKNOWN: i32 = 1i32
未指定的相机错误。
Sourcepub const CAMERA_ERROR_EVICTED: i32 = 2i32
pub const CAMERA_ERROR_EVICTED: i32 = 2i32
由于优先级较高的用户正在使用,相机已断开连接。
Sourcepub const CAMERA_ERROR_DISABLED: i32 = 3i32
pub const CAMERA_ERROR_DISABLED: i32 = 3i32
由于设备策略更改或客户端应用程序进入后台,相机已断开连接。
Sourcepub const CAMERA_ERROR_SERVER_DIED: i32 = 100i32
pub const CAMERA_ERROR_SERVER_DIED: i32 = 100i32
媒体服务器死机。在这种情况下,应用程序必须释放相机对象并实例化一个新的。
Sourcepub const ACTION_NEW_PICTURE: &'static str = "android.hardware.action.NEW_PICTURE"
pub const ACTION_NEW_PICTURE: &'static str = "android.hardware.action.NEW_PICTURE"
广播操作:相机拍摄了一张新照片,照片的条目已添加到媒体存储中。 android.content.Intent#getData是照片的URI。 在android.os.Build.VERSION_CODES#N Android N中,此广播已被移除,应用程序建议使用android.app.job.JobInfo.Builder JobInfo.Builder.android.app.job.JobInfo.Builder#addTriggerContentUri代替。 在android.os.Build.VERSION_CODES#O Android O中,此广播已恢复,但仅限于已注册的接收器。 如果应用程序正在积极运行,并且希望立即收到有关拍摄照片的清晰信号,则可以再次监听广播,但任何因此而进行繁重工作(或需要启动)的内容应仍应使用JobScheduler。
Sourcepub const ACTION_NEW_VIDEO: &'static str = "android.hardware.action.NEW_VIDEO"
pub const ACTION_NEW_VIDEO: &'static str = "android.hardware.action.NEW_VIDEO"
广播操作:相机录制了一段新视频,视频的条目已添加到媒体存储中。 android.content.Intent#getData是视频的URI。 在android.os.Build.VERSION_CODES#N Android N中,此广播已被移除,应用程序建议使用android.app.job.JobInfo.Builder JobInfo.Builder.android.app.job.JobInfo.Builder#addTriggerContentUri代替。 在android.os.Build.VERSION_CODES#O Android O中,此广播已恢复,但仅限于已注册的接收器。 如果应用程序正在积极运行,并且希望立即收到有关录制视频的清晰信号,则可以再次监听广播,但任何因此而进行繁重工作(或需要启动)的内容应仍应使用JobScheduler。
Sourcepub const CAMERA_HAL_API_VERSION_1_0: i32 = 256i32
pub const CAMERA_HAL_API_VERSION_1_0: i32 = 256i32
Camera HAL设备API版本1.0
Sourcepub const CAMERA_HAL_API_VERSION_3_0: i32 = 768i32
pub const CAMERA_HAL_API_VERSION_3_0: i32 = 768i32
Camera HAL设备API版本3.0
Sourcepub fn get_number_of_cameras() -> i32
pub fn get_number_of_cameras() -> i32
返回此设备上可用的物理相机的数量。 如果设备支持外部相机并且连接或断开了外部相机,则此方法的返回值可能会动态变化。 如果系统中存在android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA逻辑多相机,为了保持应用程序向后兼容性,此方法将只暴露每个面向的逻辑相机和物理相机组中的一个相机。 使用camera2 API以查看所有相机。 返回:可访问的相机设备总数,如果没有相机或枚举它们时发生错误,则为0。
Sourcepub fn get_camera_info(
camera_id: i32,
camera_info: &Camera_CameraInfo,
) -> Result<(), <Self as JType>::Error>
pub fn get_camera_info( camera_id: i32, camera_info: &Camera_CameraInfo, ) -> Result<(), <Self as JType>::Error>
返回有关特定相机的信息。如果 getNumberOfCameras() 返回 N,则有效 ID 为 0 到 N-1。 抛出:RuntimeException – 如果提供了无效 ID,或者检索信息时出错(通常是由于硬件或其他低级故障)。
Sourcepub fn open(camera_id: i32) -> Result<Self, <Self as JType>::Error>
pub fn open(camera_id: i32) -> Result<Self, <Self as JType>::Error>
创建一个新的 Camera 对象以访问特定的硬件摄像头。如果其他应用程序打开了同一个摄像头,这将引发 RuntimeException。
使用完摄像头后,您必须调用 release(),否则它将保持锁定状态,其他应用程序无法使用。
对于特定的硬件摄像头,您的应用程序一次只能激活一个 Camera 对象。来自其他方法的回调将传递到调用 open() 的线程的事件循环。
如果此线程没有事件循环,则回调将传递到主应用程序事件循环。如果没有主应用程序事件循环,则不会传递回调。
注意:在某些设备上,此方法可能需要很长时间才能完成。最好从工作线程(可能使用 android.os.AsyncTask)调用此方法,以避免阻塞主应用程序 UI 线程。
返回:一个新的 Camera 对象,已连接、已锁定并可供使用。
抛出:RuntimeException – 如果打开相机失败(例如,如果相机正在被另一个进程使用或设备策略管理器已禁用相机)。
camera_id
要访问的硬件摄像头,介于 0 和 getNumberOfCameras()-1 之间。
Sourcepub fn open_convenience() -> Option<Self>
pub fn open_convenience() -> Option<Self>
创建一个新的 Camera 对象来访问设备上的第一个后置摄像头。如果设备没有后置摄像头,则返回 null。否则,其作用类似于 open(int) 调用。 返回:第一个后置摄像头的新 Camera 对象,如果没有后置摄像头,则返回 null
Sourcepub fn open_legacy(
camera_id: i32,
hal_version: i32,
) -> Result<Self, <Self as JType>::Error>
pub fn open_legacy( camera_id: i32, hal_version: i32, ) -> Result<Self, <Self as JType>::Error>
使用给定的 hal API 版本创建一个新的 Camera 对象来访问特定的硬件摄像头。如果其他应用程序打开了同一个摄像头,或者此设备不支持该 hal API 版本,则会抛出 RuntimeException。 从 Android 12 开始,不再支持 HAL 版本 1。使用完摄像头后,您必须调用 release(),否则它将保持锁定状态,其他应用程序无法使用。 对于特定的硬件摄像头,您的应用程序一次只能激活一个 Camera 对象。来自其他方法的回调将传递到调用 open() 的线程的事件循环。 如果此线程没有事件循环,则回调将传递到主应用程序事件循环。如果没有主应用程序事件循环,则不会传递回调。 注意:在某些设备上,此方法可能需要很长时间才能完成。最好从工作线程(可能使用 android.os.AsyncTask)调用此方法,以避免阻塞主应用程序 UI 线程。 返回:一个新的 Camera 对象,已连接、已锁定且可供使用。 抛出:
- IllegalArgumentException – 如果 halVersion 无效
- RuntimeException – 如果打开摄像头失败(例如,如果摄像头正在被另一个进程使用或设备策略管理器已禁用摄像头)。
camera_id
要访问的硬件摄像头,介于 0 和 getNumberOfCameras()-1 之间。hal_version
要打开的此摄像头设备的 HAL API 版本。
Sourcepub fn unlock(&self) -> Result<(), <Self as JType>::Error>
pub fn unlock(&self) -> Result<(), <Self as JType>::Error>
解锁摄像头以允许其他进程访问它。通常,摄像头会锁定到具有活动 Camera 对象的进程,直到调用 release()。 为了允许进程之间快速切换,您可以调用此方法暂时释放摄像头以供其他进程使用;其他进程完成后,您可以调用 reconnect() 来回收摄像头。 必须在调用 android.media.MediaRecorder.setCamera(Camera) 之前完成此操作。录制开始后无法调用此方法。如果您没有录制视频,则可能不需要此方法。 抛出:RuntimeException – 如果无法解锁摄像头。
Sourcepub fn lock(&self) -> Result<(), <Self as JType>::Error>
pub fn lock(&self) -> Result<(), <Self as JType>::Error>
重新锁定摄像头以防止其他进程访问它。除非调用 unlock(),否则摄像头对象默认处于锁定状态。通常使用 reconnect()。 从 API 级别 14 开始,android.media.MediaRecorder.start() 中的应用程序会自动锁定摄像头。应用程序可以在录制开始后使用摄像头(例如:缩放)。录制开始或停止后无需调用此方法。如果您没有录制视频,则可能不需要此方法。 抛出:RuntimeException – 如果无法重新锁定摄像头(例如,如果另一个进程仍在使用摄像头)。
Sourcepub fn reconnect(&self) -> Result<(), <Self as JType>::Error>
pub fn reconnect(&self) -> Result<(), <Self as JType>::Error>
在另一个进程使用摄像头服务后重新连接到该服务。调用 unlock() 后,另一个进程可以使用摄像头;当该进程完成后,您必须重新连接到摄像头,这将重新获取锁定并允许您继续使用摄像头。 从 API 级别 14 开始,android.media.MediaRecorder.start() 中的应用程序会自动锁定摄像头。应用程序可以在录制开始后使用摄像头(例如:缩放)。录制开始或停止后无需调用此方法。如果您没有录制视频,则可能不需要此方法。 抛出:
- IOException - 如果无法重新建立连接(例如,如果另一个进程仍在使用摄像头)。
- RuntimeException - 如果已在此 Camera 实例上调用 release()。
Sourcepub fn set_preview_display<SH: SurfaceHolder>(
&self,
holder: Option<SH>,
) -> Result<(), <Self as JType>::Error>
pub fn set_preview_display<SH: SurfaceHolder>( &self, holder: Option<SH>, ) -> Result<(), <Self as JType>::Error>
设置用于实时预览的 Surface。预览需要表面或表面纹理,而预览是拍照所必需的。 可以重新设置相同的表面而不会造成损害。设置预览表面将取消设置通过 setPreviewTexture 设置的任何预览表面纹理。 调用此方法时,SurfaceHolder 必须已包含表面。如果您使用的是 android.view.SurfaceView,则需要使用 SurfaceHolder.addCallback(SurfaceHolder.Callback) 注册 SurfaceHolder.Callback,并在调用 setPreviewDisplay() 或开始预览之前等待 SurfaceHolder.Callback.surfaceCreated(SurfaceHolder)。 此方法必须在 startPreview() 之前调用。一个例外是,如果在调用 startPreview() 之前未设置预览表面(或设置为 null),则可以使用非 null 参数调用此方法一次以设置预览表面。 (这允许相机设置和表面创建并行进行,从而节省时间。)预览运行时,预览表面可能不会发生变化。 抛出:
- IOException – 如果该方法失败(例如,如果表面不可用或不合适)。
- RuntimeException – 如果已在此 Camera 实例上调用 release()。
holder
– 包含放置预览的表面,或 null 以删除预览表面
Sourcepub fn set_preview_surface(
&self,
surface: &Surface,
) -> Result<(), <Self as JType>::Error>
pub fn set_preview_surface( &self, surface: &Surface, ) -> Result<(), <Self as JType>::Error>
抛出:IOException
Sourcepub fn set_preview_texture(
&self,
surface_texture: Option<&SurfaceTexture>,
) -> Result<(), <Self as JType>::Error>
pub fn set_preview_texture( &self, surface_texture: Option<&SurfaceTexture>, ) -> Result<(), <Self as JType>::Error>
设置用于实时预览的 SurfaceTexture。预览需要表面或表面纹理,而预览需要拍照。可以重新设置相同的表面纹理而不会造成任何损害。 设置预览表面纹理将取消设置通过 setPreviewDisplay 设置的任何预览表面。此方法必须在 startPreview() 之前调用。唯一的例外是,如果在调用 startPreview() 之前未设置预览表面纹理(或将其设置为 null),则可以使用非 null 参数调用此方法一次以设置预览表面。(这允许并行进行相机设置和表面创建,从而节省时间。) 预览表面纹理在预览运行时可能不会发生变化。 SurfaceTexture.getTimestamp() 为设置为预览纹理的 SurfaceTexture 提供的时间戳具有未指定的零点,并且无法直接在不同的相机或同一相机的不同实例之间进行比较,也无法在同一程序的多次运行之间进行比较。 如果您使用预览数据来创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 来向用户正确指示图像捕获或录制开始/停止。 抛出:
- IOException – 如果该方法失败(例如,如果表面纹理不可用或不合适)。
- RuntimeException – 如果已在此 Camera 实例上调用 release()。
surface_texture
预览图像要发送到的 SurfaceTexture 或 null 以删除当前预览表面纹理
Sourcepub fn start_preview(&self) -> Result<(), <Self as JType>::Error>
pub fn start_preview(&self) -> Result<(), <Self as JType>::Error>
开始捕获预览帧并将其绘制到屏幕上。在使用 setPreviewDisplay(SurfaceHolder) 或 setPreviewTexture(SurfaceTexture) 提供表面之前,预览不会真正开始。 如果调用了 setPreviewCallback(Camera.PreviewCallback)、setOneShotPreviewCallback(Camera.PreviewCallback) 或 setPreviewCallbackWithBuffer(Camera.PreviewCallback),则在预览数据可用时将调用 Camera.PreviewCallback.onPreviewFrame(byte[], Camera)。 抛出:RuntimeException – 如果启动预览失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。setPreviewSize 和 setPictureSize 中提到的 QCIF (176x144) 异常也可能导致抛出此异常。
Sourcepub fn stop_preview(&self) -> Result<(), <Self as JType>::Error>
pub fn stop_preview(&self) -> Result<(), <Self as JType>::Error>
停止捕获和将预览帧绘制到表面,并重置相机以便将来调用 startPreview()。 抛出:RuntimeException – 如果停止预览失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
Sourcepub fn preview_enabled(&self) -> bool
pub fn preview_enabled(&self) -> bool
返回当前预览状态。 FIXME:发布前取消隐藏
Sourcepub fn set_preview_callback<C: Camera_PreviewCallback>(
&self,
cb: Option<C>,
) -> Result<(), <Self as JType>::Error>
pub fn set_preview_callback<C: Camera_PreviewCallback>( &self, cb: Option<C>, ) -> Result<(), <Self as JType>::Error>
安装一个回调,用于在屏幕上显示每个预览帧并调用它们。只要预览处于活动状态,就会重复调用回调。
此方法可随时调用,即使预览处于活动状态。任何其他预览回调都将被覆盖。
如果您使用预览数据创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 向用户正确指示图像捕获或录制开始/停止。
抛出:RuntimeException – 如果已在此 Camera 实例上调用 release()。
cb
一个回调对象,用于接收每个预览帧的副本,或 null 以停止接收回调。
Sourcepub fn set_one_shot_preview_callback<C: Camera_PreviewCallback>(
&self,
cb: Option<C>,
) -> Result<(), <Self as JType>::Error>
pub fn set_one_shot_preview_callback<C: Camera_PreviewCallback>( &self, cb: Option<C>, ) -> Result<(), <Self as JType>::Error>
除了在屏幕上显示下一个预览帧外,还安装一个回调函数,用于调用该回调函数来获取下一个预览帧。调用一次后,回调函数将被清除。
此方法可随时调用,即使预览处于实时状态。任何其他预览回调函数都将被覆盖。
如果您使用预览数据来创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 来向用户正确指示图像捕获或录制开始/停止。
抛出:RuntimeException – 如果已在此 Camera 实例上调用 release()。
cb
一个回调对象,用于接收下一个预览帧的副本,或 null 以停止接收回调函数。
Sourcepub fn set_preview_callback_with_buffer<C: Camera_PreviewCallback>(
&self,
cb: Option<C>,
) -> Result<(), <Self as JType>::Error>
pub fn set_preview_callback_with_buffer<C: Camera_PreviewCallback>( &self, cb: Option<C>, ) -> Result<(), <Self as JType>::Error>
安装一个回调函数,使用 addCallbackBuffer(byte[]) 提供的缓冲区为每个预览帧调用该回调函数,并将它们显示在屏幕上。
只要预览处于活动状态且缓冲区可用,就会重复调用回调函数。任何其他预览回调函数都将被覆盖。
此方法的目的是通过允许预览帧内存重用来提高预览效率和帧速率。您必须在某个时间点(在调用此方法之前或之后)调用 addCallbackBuffer(byte[]),否则将不会收到任何回调函数。
如果使用空回调函数调用此方法、调用 setPreviewCallback(Camera.PreviewCallback) 或调用 setOneShotPreviewCallback(Camera.PreviewCallback),则缓冲区队列将被清除。
如果您使用预览数据创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 向用户正确指示图像捕获或录制开始/停止。
抛出:RuntimeException – 如果已在此 Camera 实例上调用 release()。
cb
一个接收预览帧副本的回调对象,或 null 以停止接收回调并清除缓冲区队列。
Sourcepub fn add_callback_buffer(&self, callback_buffer: &[u8])
pub fn add_callback_buffer(&self, callback_buffer: &[u8])
将预分配的缓冲区添加到预览回调缓冲区队列。应用程序可以向队列添加一个或多个缓冲区。当预览帧到达且至少有一个可用缓冲区时,将使用该缓冲区并将其从队列中删除。
然后使用该缓冲区调用预览回调。如果帧到达且没有剩余缓冲区,则丢弃该帧。
应用程序应在完成处理缓冲区中的数据后将其添加回去。对于 YV12 以外的格式,缓冲区的大小由预览图像宽度、高度和每像素字节数相乘来确定。
宽度和高度可以从 Camera.Parameters.getPreviewSize() 中读取。可以使用 Camera.Parameters.getPreviewFormat() 中的图像格式,从 ImageFormat.getBitsPerPixel(int)/8 计算每像素字节数。
如果使用 ImageFormat.YV12 格式,则可以使用 Camera.Parameters.setPreviewFormat 中列出的公式计算大小。仅当使用 setPreviewCallbackWithBuffer(Camera.PreviewCallback) 时才需要此方法。
使用 setPreviewCallback(Camera.PreviewCallback) 或 setOneShotPreviewCallback(Camera.PreviewCallback) 时,会自动分配缓冲区。当提供的缓冲区太小而无法容纳预览帧数据时,预览回调将返回 null,并且缓冲区将从缓冲区队列中删除。
callback_buffer
是要添加到队列的缓冲区。缓冲区的大小必须与上面描述的值匹配。
Sourcepub fn add_raw_image_callback_buffer(&self, callback_buffer: &[u8])
pub fn add_raw_image_callback_buffer(&self, callback_buffer: &[u8])
将预分配的缓冲区添加到原始图像回调缓冲区队列。应用程序可以向队列添加一个或多个缓冲区。
当原始图像帧到达且至少有一个可用缓冲区时,该缓冲区将用于保存原始图像数据并从队列中删除。然后使用缓冲区调用原始图像回调。
如果原始图像帧到达但没有剩余缓冲区,则丢弃该帧。应用程序应在完成处理缓冲区中的数据后通过再次调用此方法重新添加缓冲区,以避免耗尽原始图像回调缓冲区。
缓冲区的大小由原始图像宽度、高度和每像素字节数相乘确定。宽度和高度可以从 Camera.Parameters.getPictureSize() 中读取。
每像素字节数可以从 ImageFormat.getBitsPerPixel(int)/8 计算,使用 Camera.Parameters.getPreviewFormat() 中的图像格式。仅当在调用 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) 时使用原始图像的 PictureCallback 时,才需要此方法。
请注意,通过调用此方法,将触发应用程序管理的回调缓冲区模式。如果从未调用过此方法,则原始图像回调将返回 null,因为没有可用的图像回调缓冲区。
此外,当提供的缓冲区太小而无法容纳原始图像数据时,原始图像回调将返回 null,并且缓冲区将从缓冲区队列中删除。
callback_buffer
是要添加到原始图像回调缓冲区队列的缓冲区。大小应为宽度 * 高度 *(每像素位数)/ 8。null 的回调缓冲区将被忽略,不会添加到队列中。
Sourcepub fn create_preview_allocation(
&self,
rs: &RenderScript,
usage: i32,
) -> Result<Allocation, <Self as JType>::Error>
pub fn create_preview_allocation( &self, rs: &RenderScript, usage: i32, ) -> Result<Allocation, <Self as JType>::Error>
创建 RenderScript 分配以用作预览回调帧的目标。使用 setPreviewCallbackAllocation 将创建的分配用作相机预览帧的目标。
分配将使用 YUV 类型创建,并且必须使用 rsGetElementAtYuv_* 访问器方法在 RenderScript 中访问其内容。其大小将基于为此相机配置的当前预览大小。
返回:尺寸等于当前预览大小的新 YUV 类型分配。
抛出:RSIllegalArgumentException - 如果使用标志与 YUV 分配不兼容。
rs
此分配的 RenderScript 上下文。
usage
为分配设置的其他使用标志。使用标志 Allocation.USAGE_IO_INPUT 将始终设置在创建的分配上,但可以在此处提供其他标志。
Sourcepub fn set_preview_callback_allocation(
&self,
preview_allocation: Option<&Allocation>,
) -> Result<(), <Self as JType>::Error>
pub fn set_preview_callback_allocation( &self, preview_allocation: Option<&Allocation>, ) -> Result<(), <Self as JType>::Error>
将 Allocation 设置为预览回调数据的目标。使用此方法可以高效地处理带有 RenderScript 的相机预览数据。
必须使用 createPreviewAllocation 方法创建 Allocation。设置预览分配将禁用由 setPreviewCallback 或 setPreviewCallbackWithBuffer 设置的任何活动预览回调,反之亦然。
使用预览分配仍需要设置活动的标准预览目标,使用 setPreviewTexture 或 setPreviewDisplay。要在 Allocation 有新帧可用时收到通知,请使用 Allocation.setIoInputNotificationHandler。
要将当前可从 Allocation 访问的帧更新为最新的预览帧,请调用 Allocation.ioReceive。要禁用 Allocation 中的预览,请使用 null 参数调用此方法。
一旦设置了预览分配,setPreviewSize 设置的预览大小就无法更改。如果您希望更改预览大小,请先通过调用 setPreviewCallbackAllocation(null) 删除预览分配,然后更改预览大小,使用 createPreviewAllocation 创建新的预览分配,并将其设置为新的预览回调分配目标。
如果您使用预览数据创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 向用户正确指示图像捕获或录制开始/停止。
抛出:IOException – 如果配置相机以使用分配进行预览失败。 IllegalArgumentException – 如果分配的尺寸或其他参数不符合要求。
preview_allocation
用作预览目标的分配
Sourcepub fn auto_focus<C: Camera_AutoFocusCallback>(
&self,
cb: &C,
) -> Result<(), <Self as JType>::Error>
pub fn auto_focus<C: Camera_AutoFocusCallback>( &self, cb: &C, ) -> Result<(), <Self as JType>::Error>
启动相机自动对焦并注册一个回调函数,以便在相机对焦时运行。此方法仅在预览处于活动状态时有效(在 startPreview() 之间和 stopPreview() 之前)。
调用者应检查 android.hardware.Camera.Parameters.getFocusMode() 以确定是否应调用此方法。如果相机不支持自动对焦,则为无操作,并且将立即调用 Camera.AutoFocusCallback.onAutoFocus(boolean, Camera) 回调。
如果您的应用程序不应安装在没有自动对焦功能的设备上,则必须使用 清单元素声明您的应用程序使用自动对焦。如果当前闪光灯模式不是 android.hardware.Camera.Parameters.FLASH_MODE_OFF,则闪光灯可能会在自动对焦期间触发,具体取决于驱动程序和相机硬件。
自动曝光锁 android.hardware.Camera.Parameters.getAutoExposureLock() 和自动白平衡锁 android.hardware.Camera.Parameters.getAutoWhiteBalanceLock() 在自动对焦期间和之后不会改变。但自动对焦例程可能会在对焦期间暂时停止自动曝光和自动白平衡。
使用 stopPreview() 停止预览,或使用 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback) 触发静态图像捕获,不会改变焦点位置。应用程序必须调用 cancelAutoFocus 来重置焦点。
如果自动对焦成功,请考虑使用 android.media.MediaActionSound 向用户正确播放自动对焦成功声音。
抛出:RuntimeException – 如果启动自动对焦失败;通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
cb
要运行的回调
Sourcepub fn cancel_auto_focus(&self) -> Result<(), <Self as JType>::Error>
pub fn cancel_auto_focus(&self) -> Result<(), <Self as JType>::Error>
取消正在进行的任何自动对焦功能。无论自动对焦当前是否正在进行,此函数都会将焦点位置返回到默认值。 如果相机不支持自动对焦,则此操作无效。 抛出:RuntimeException – 如果取消自动对焦失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
Sourcepub fn set_auto_focus_move_callback<C: Camera_AutoFocusMoveCallback>(
&self,
cb: &C,
)
pub fn set_auto_focus_move_callback<C: Camera_AutoFocusMoveCallback>( &self, cb: &C, )
设置相机自动对焦移动回调。
抛出:RuntimeException – 如果启用对焦移动回调失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
cb
要运行的回调
Sourcepub fn take_picture_convenience<C: Camera_ShutterCallback, D: Camera_PictureCallback>(
&self,
shutter: Option<&C>,
raw: Option<&D>,
jpeg: Option<&D>,
) -> Result<(), <Self as JType>::Error>
pub fn take_picture_convenience<C: Camera_ShutterCallback, D: Camera_PictureCallback>( &self, shutter: Option<&C>, raw: Option<&D>, jpeg: Option<&D>, ) -> Result<(), <Self as JType>::Error>
相当于 takePicture(Shutter, raw, null, jpeg)。
Sourcepub fn take_picture<C: Camera_ShutterCallback, D: Camera_PictureCallback>(
&self,
shutter: Option<&C>,
raw: Option<&D>,
post_view: Option<&D>,
jpeg: Option<&D>,
) -> Result<(), <Self as JType>::Error>
pub fn take_picture<C: Camera_ShutterCallback, D: Camera_PictureCallback>( &self, shutter: Option<&C>, raw: Option<&D>, post_view: Option<&D>, jpeg: Option<&D>, ) -> Result<(), <Self as JType>::Error>
触发异步图像捕获。相机服务将在图像捕获过程中向应用程序发起一系列回调。
快门回调发生在图像捕获后。这可用于触发声音,让用户知道图像已捕获。
原始回调发生在原始图像数据可用时(注意:如果没有可用的原始图像回调缓冲区或原始图像回调缓冲区不足以容纳原始图像,则数据将为空)。
后视图回调发生在缩放的、完全处理的后视图图像可用时(注意:并非所有硬件都支持此功能)。
jpeg 回调发生在压缩图像可用时。如果应用程序不需要特定的回调,则可以传递 null 而不是回调方法。
此方法仅在预览处于活动状态时有效(在 startPreview() 之后)。拍摄图像后将停止预览;如果调用者想要重新启动预览或拍摄更多照片,则必须再次调用 startPreview()。
不应在 android.media.MediaRecorder.start() 和 android.media.MediaRecorder.stop() 之间调用此方法。调用此方法后,在 JPEG 回调返回之前,您不得调用 startPreview() 或拍摄另一张照片。
抛出:RuntimeException – 如果开始图片捕获失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
shutter
图像捕获时刻的回调,或为 null
raw
原始(未压缩)图像数据的回调,或为 null
post_view
带有 post_view 图像数据的回调,可能为 null
jpeg
JPEG 图像数据的回调,或为 null
Sourcepub fn start_smooth_zoom(
&self,
value: i32,
) -> Result<(), <Self as JType>::Error>
pub fn start_smooth_zoom( &self, value: i32, ) -> Result<(), <Self as JType>::Error>
平稳缩放到请求的值。驱动程序将通知 Camera.OnZoomChangeListener 缩放值以及缩放是否在此时停止。 例如,假设当前缩放为 0,并使用值 3 调用 startSmoothZoom。Camera.OnZoomChangeListener.onZoomChange(int, boolean, Camera) 方法将被调用三次,缩放值分别为 1、2 和 3。 应用程序可以调用 stopSmoothZoom 以提前停止缩放。应用程序不应在缩放停止前再次调用 startSmoothZoom 或更改缩放值。 如果提供的缩放值等于当前缩放值,则不会生成缩放回调。如果 android.hardware.Camera.Parameters.isSmoothZoomSupported 返回 true,则支持此方法。 抛出:
- IllegalArgumentException – 如果缩放值无效。
- RuntimeException – 如果方法失败。
value
缩放值。有效范围为 0 到 android.hardware.Camera.Parameters.getMaxZoom。
Sourcepub fn stop_smooth_zoom(&self) -> Result<(), <Self as JType>::Error>
pub fn stop_smooth_zoom(&self) -> Result<(), <Self as JType>::Error>
停止平滑缩放。应用程序应等待 Camera.OnZoomChangeListener 来获知缩放何时真正停止。 如果 android.hardware.Camera.Parameters.isSmoothZoomSupported 为 true,则支持此方法。 抛出:RuntimeException – 如果该方法失败。
Sourcepub fn set_display_orientation(
&self,
degrees: i32,
) -> Result<(), <Self as JType>::Error>
pub fn set_display_orientation( &self, degrees: i32, ) -> Result<(), <Self as JType>::Error>
设置预览显示的顺时针旋转度数。这会影响预览帧和快照后显示的图片。此方法对于人像模式应用很有用。 请注意,前置摄像头的预览显示在旋转之前会水平翻转,即图像沿摄像头传感器的中心垂直轴反射。因此用户可以看到自己就像在看镜子一样。 这不会影响在 Camera.PreviewCallback.onPreviewFrame、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; // 补偿镜子
} else {
// 背面
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
从 API 级别 14 开始,可以在预览处于活动状态时调用此方法。注意:在 API 级别 24 之前,方向的默认值为 0。
从 API 级别 24 开始,默认方向将是这样的,即强制横向模式下的应用程序将具有正确的预览方向,该方向可以是默认值 0 或 180。在纵向模式下运行或允许更改方向的应用程序仍必须在每次方向更改后调用此方法,以确保在所有情况下都能正确显示预览。
抛出:RuntimeException - 如果设置方向失败;通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
degrees
图片顺时针旋转的角度。有效值为 0、90、180 和 270。
Sourcepub fn enable_shutter_sound(
&self,
enabled: bool,
) -> Result<bool, <Self as JType>::Error>
pub fn enable_shutter_sound( &self, enabled: bool, ) -> Result<bool, <Self as JType>::Error>
启用或禁用拍照时的默认快门声音。默认情况下,调用 takePicture 时,相机会播放系统定义的相机快门声音。
使用此方法可以禁用快门声音。强烈建议在禁用系统快门声音时在 Camera.ShutterCallback 中播放替代快门声音。
请注意,设备可能并不总是允许禁用相机快门声音。如果无法将快门声音状态设置为所需值,则此方法将返回 false。
Camera.CameraInfo.canDisableShutterSound 可用于确定设备是否允许禁用快门声音。
返回:如果成功更改了快门声音状态,则返回 true。如果无法更改快门声音状态,则返回 false。如果快门声音播放已设置为请求的状态,也会返回 true。
抛出:RuntimeException – 如果调用失败;通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
enabled
调用 takePicture 时相机是否应播放系统快门声音。
Sourcepub fn disable_shutter_sound(&self) -> bool
pub fn disable_shutter_sound(&self) -> bool
无条件禁用快门声音。这只保证适用于旧式相机(即使用 cameraInitUnspecified 初始化的相机)。 尝试在普通相机上调用此功能将强制在相机服务中进行条件检查。 返回:如果成功更改了快门声音状态,则返回 true。如果无法更改快门声音状态,则返回 false。如果快门声音播放已设置为请求的状态,也会返回 true。
Sourcepub fn set_zoom_change_listener<L: Camera_OnZoomChangeListener>(
&self,
listener: &L,
)
pub fn set_zoom_change_listener<L: Camera_OnZoomChangeListener>( &self, listener: &L, )
注册一个监听器,以便在平滑变焦期间相机驱动程序更新变焦值时收到通知。
listener
要通知的监听器
Sourcepub fn set_face_detection_listener<L: Camera_FaceDetectionListener>(
&self,
listener: &L,
)
pub fn set_face_detection_listener<L: Camera_FaceDetectionListener>( &self, listener: &L, )
注册一个侦听器,以便接收有关预览帧中检测到的面部的通知。
listener
要通知的侦听器
Sourcepub fn start_face_detection(&self) -> Result<(), <Self as JType>::Error>
pub fn start_face_detection(&self) -> Result<(), <Self as JType>::Error>
开始人脸检测。应在预览启动后调用此方法。相机将通知 Camera.FaceDetectionListener 预览帧中检测到的人脸。 检测到的人脸可能与之前的相同。应用程序应调用 stopFaceDetection 来停止人脸检测。如果 Camera.Parameters.getMaxNumDetectedFaces() 返回大于 0 的数字,则支持此方法。 如果人脸检测已启动,应用程序不应再次调用此方法。 当人脸检测正在运行时,Camera.Parameters.setWhiteBalance(String)、Camera.Parameters.setFocusAreas(List) 和 Camera.Parameters.setMeteringAreas(List) 不起作用。 相机使用检测到的人脸进行自动白平衡、自动曝光和自动对焦。 如果应用程序调用 autoFocus(Camera.AutoFocusCallback),相机将停止发送人脸回调。 最后一个人脸回调指示用于进行自动对焦的区域。对焦完成后,人脸检测将恢复发送人脸回调。如果应用调用 cancelAutoFocus(),人脸回调也将恢复。 调用 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback) 或 stopPreview() 后,再使用 startPreview() 恢复预览,应用应再次调用此方法以恢复人脸检测。 抛出:
- IllegalArgumentException – 如果不支持人脸检测。
- RuntimeException – 如果方法失败或人脸检测已在运行。
Sourcepub fn stop_face_detection(&self)
pub fn stop_face_detection(&self)
停止人脸检测。
Sourcepub fn set_error_callback<C: Camera_ErrorCallback>(&self, cb: &C)
pub fn set_error_callback<C: Camera_ErrorCallback>(&self, cb: &C)
注册一个在发生错误时调用的回调。
cb
要运行的回调
Sourcepub fn set_detailed_error_callback<C: Camera_ErrorCallback>(&self, cb: &C)
pub fn set_detailed_error_callback<C: Camera_ErrorCallback>(&self, cb: &C)
注册一个在发生错误时调用的回调。详细的错误回调可能包含错误代码,提供有关错误的更多详细信息。设置详细回调后,通过 #setErrorCallback(ErrorCallback) 设置的回调将停止接收 onError 调用。
cb
要运行的回调
Sourcepub fn set_parameters(
&self,
params: Camera_Parameters,
) -> Result<(), <Self as JType>::Error>
pub fn set_parameters( &self, params: Camera_Parameters, ) -> Result<(), <Self as JType>::Error>
更改此相机服务的设置。
抛出:RuntimeException – 如果任何参数无效或不受支持。
params
此相机服务要使用的参数
Sourcepub fn get_parameters(
&self,
) -> Result<Camera_Parameters, <Self as JType>::Error>
pub fn get_parameters( &self, ) -> Result<Camera_Parameters, <Self as JType>::Error>
返回此相机服务的当前设置。如果对返回的参数进行了修改,则必须将其传递给 setParameters(Camera.Parameters) 才能生效。 抛出:RuntimeException – 如果读取参数失败;这通常是由于硬件或其他低级错误,或者因为已在此相机实例上调用 release()。
Sourcepub fn get_empty_parameters() -> Camera_Parameters
pub fn get_empty_parameters() -> Camera_Parameters
返回一个空的 Camera.Parameters 以用于测试目的。 返回:一个参数对象。
Sourcepub fn get_parameters_copy(
parameters: &Camera_Parameters,
) -> Result<Camera_Parameters, <Self as JType>::Error>
pub fn get_parameters_copy( parameters: &Camera_Parameters, ) -> Result<Camera_Parameters, <Self as JType>::Error>
返回一个复制的 Camera.Parameters;仅供 shim 使用。
返回:一个 Parameter 对象,所有参数均从参数中复制而来。
抛出:NullPointerException – 如果参数为空
parameters
一个非空参数
Sourcepub fn set_audio_restriction(&self, mode: i32)
pub fn set_audio_restriction(&self, mode: i32)
设置相机音频限制模式。
Sourcepub fn get_audio_restriction(&self) -> i32
pub fn get_audio_restriction(&self) -> i32
获取当前应用的相机音频限制模式。