droid_wrap/android/
hardware.rs

1/*
2 * Copyright (c) 2024. The RigelA open source project team and
3 * its contributors reserve all rights.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and limitations under the License.
12 */
13
14#![allow(deprecated)]
15
16use crate::{
17    JObjNew, JObjRef, JType, Result,
18    android::{
19        graphics::{Point, Rect, SurfaceTexture},
20        renderscript::{Allocation, RenderScript},
21        view::{Surface, SurfaceHolder},
22    },
23    java_class, java_constructor, java_field, java_interface, java_method,
24};
25
26/// 振动器
27#[cfg(feature = "android_hardware_vibrator")]
28pub mod vibrator;
29
30/**
31Camera类用于设置图像捕获设置,开始/停止预览,拍摄照片,并检索用于编码的视频帧。
32此类是Camera服务的客户端,该服务管理实际的相机硬件。
33
34要访问设备相机,您必须在Android清单中声明android.Manifest.permission#CAMERA权限。还要确保包含 `<uses-feature>` 清单元素,以声明应用程序使用的相机功能。
35例如,如果您使用相机和自动对焦功能,您的清单应包含以下内容:
36```xml
37<uses-permission android:name="android.permission.CAMERA" />
38<uses-feature android:name="android.hardware.camera" />
39<uses-feature android:name="android.hardware.camera.autofocus" />
40```
41
42使用此类拍照的步骤如下:
43- 从open(int)获取Camera实例。
44- 使用getParameters()获取现有(默认)设置。
45- 如果需要,修改返回的Camera.Parameters对象并调用setParameters(Camera.Parameters)。
46- 调用setDisplayOrientation(int)以确保预览的正确方向。
47- 重要:将完全初始化的SurfaceHolder传递给setPreviewDisplay(SurfaceHolder)。没有表面,相机将无法启动预览。
48- 重要:调用startPreview()以开始更新预览表面。在拍照之前必须先启动预览。
49- 当您想拍照时,调用takePicture(Camera.ShutterCallback,Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)来捕获照片。等待回调提供实际图像数据。
50- 拍照后,预览显示将停止。要拍摄更多照片,请先调用startPreview()。
51- 调用stopPreview()停止更新预览表面。
52- 重要:调用release()释放相机供其他应用程序使用。应用程序应在android.app.Activity#onPause()中立即释放相机(并在android.app.Activity#onResume()中重新open())。
53
54要快速切换到视频录制模式,请使用以下步骤:
55- 获取并初始化Camera并启动预览,如上所述。
56- 调用unlock()允许媒体进程访问相机。
57- 将相机传递给android.media.MediaRecorder#setCamera(Camera)。有关视频录制的更多信息,请参阅android.media.MediaRecorder。
58- 完成录制后,调用reconnect()重新获取并锁定相机。
59- 如果需要,重新启动预览并拍摄更多照片或视频。
60- 调用stopPreview()和release(),如上所述。
61
62此类不是线程安全的,旨在从单个事件线程使用。大多数长时间运行的操作(预览、对焦、拍照等)都是异步执行的,并在必要时调用回调。
63回调将在open(int)被调用的事件线程上调用。此类的方法绝不能同时从多个线程调用。
64
65<p class="caution">
66<strong>注意:</strong>
67不同的Android设备可能具有不同的硬件规格,例如百万像素评级和对焦能力。为了使您的应用程序与更多设备兼容,您不应对设备相机规格做出假设。
68</p>
69
70开发者指南<
71有关使用相机的更多信息,请阅读开发者指南。
72*/
73#[java_class(name = "android/hardware/Camera")]
74#[deprecated(note = "我们建议使用新的android.hardware.camera2 API来编写新应用程序。")]
75pub struct Camera;
76
77impl Camera {
78    /// 未指定的相机错误。
79    pub const CAMERA_ERROR_UNKNOWN: i32 = 1;
80
81    /// 由于优先级较高的用户正在使用,相机已断开连接。
82    pub const CAMERA_ERROR_EVICTED: i32 = 2;
83
84    /// 由于设备策略更改或客户端应用程序进入后台,相机已断开连接。
85    pub const CAMERA_ERROR_DISABLED: i32 = 3;
86
87    /// 媒体服务器死机。在这种情况下,应用程序必须释放相机对象并实例化一个新的。
88    pub const CAMERA_ERROR_SERVER_DIED: i32 = 100;
89
90    /**
91    广播操作:相机拍摄了一张新照片,照片的条目已添加到媒体存储中。
92    android.content.Intent#getData是照片的URI。
93    在android.os.Build.VERSION_CODES#N Android N中,此广播已被移除,应用程序建议使用android.app.job.JobInfo.Builder JobInfo.Builder.android.app.job.JobInfo.Builder#addTriggerContentUri代替。
94    在android.os.Build.VERSION_CODES#O Android O中,此广播已恢复,但仅限于已注册的接收器。
95    如果应用程序正在积极运行,并且希望立即收到有关拍摄照片的清晰信号,则可以再次监听广播,但任何因此而进行繁重工作(或需要启动)的内容应仍应使用JobScheduler。
96    */
97    pub const ACTION_NEW_PICTURE: &'static str = "android.hardware.action.NEW_PICTURE";
98
99    /**
100    广播操作:相机录制了一段新视频,视频的条目已添加到媒体存储中。
101    android.content.Intent#getData是视频的URI。
102    在android.os.Build.VERSION_CODES#N Android N中,此广播已被移除,应用程序建议使用android.app.job.JobInfo.Builder JobInfo.Builder.android.app.job.JobInfo.Builder#addTriggerContentUri代替。
103    在android.os.Build.VERSION_CODES#O Android O中,此广播已恢复,但仅限于已注册的接收器。
104    如果应用程序正在积极运行,并且希望立即收到有关录制视频的清晰信号,则可以再次监听广播,但任何因此而进行繁重工作(或需要启动)的内容应仍应使用JobScheduler。
105    */
106    pub const ACTION_NEW_VIDEO: &'static str = "android.hardware.action.NEW_VIDEO";
107
108    /// Camera HAL设备API版本1.0
109    pub const CAMERA_HAL_API_VERSION_1_0: i32 = 0x100;
110
111    /// Camera HAL设备API版本3.0
112    pub const CAMERA_HAL_API_VERSION_3_0: i32 = 0x300;
113
114    /**
115    返回此设备上可用的物理相机的数量。
116    如果设备支持外部相机并且连接或断开了外部相机,则此方法的返回值可能会动态变化。
117    如果系统中存在android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA逻辑多相机,为了保持应用程序向后兼容性,此方法将只暴露每个面向的逻辑相机和物理相机组中的一个相机。
118    使用camera2 API以查看所有相机。
119    返回:可访问的相机设备总数,如果没有相机或枚举它们时发生错误,则为0。
120    */
121    #[java_method]
122    pub fn get_number_of_cameras() -> i32 {}
123
124    /**
125    返回有关特定相机的信息。如果 getNumberOfCameras() 返回 N,则有效 ID 为 0 到 N-1。
126    抛出:RuntimeException – 如果提供了无效 ID,或者检索信息时出错(通常是由于硬件或其他低级故障)。
127    */
128    #[java_method]
129    pub fn get_camera_info(camera_id: i32, camera_info: &Camera_CameraInfo) -> Result<()> {}
130
131    /**
132    创建一个新的 Camera 对象以访问特定的硬件摄像头。如果其他应用程序打开了同一个摄像头,这将引发 RuntimeException。
133    使用完摄像头后,您必须调用 release(),否则它将保持锁定状态,其他应用程序无法使用。
134    对于特定的硬件摄像头,您的应用程序一次只能激活一个 Camera 对象。来自其他方法的回调将传递到调用 open() 的线程的事件循环。
135    如果此线程没有事件循环,则回调将传递到主应用程序事件循环。如果没有主应用程序事件循环,则不会传递回调。
136    注意:在某些设备上,此方法可能需要很长时间才能完成。最好从工作线程(可能使用 android.os.AsyncTask)调用此方法,以避免阻塞主应用程序 UI 线程。
137    返回:一个新的 Camera 对象,已连接、已锁定并可供使用。
138    抛出:RuntimeException – 如果打开相机失败(例如,如果相机正在被另一个进程使用或设备策略管理器已禁用相机)。
139    `camera_id` 要访问的硬件摄像头,介于 0 和 getNumberOfCameras()-1 之间。
140    */
141    #[java_method]
142    pub fn open(camera_id: i32) -> Result<Self> {}
143
144    /**
145    创建一个新的 Camera 对象来访问设备上的第一个后置摄像头。如果设备没有后置摄像头,则返回 null。否则,其作用类似于 open(int) 调用。
146    返回:第一个后置摄像头的新 Camera 对象,如果没有后置摄像头,则返回 null
147    */
148    #[java_method(overload = open)]
149    pub fn open_convenience() -> Option<Self> {}
150
151    /**
152    使用给定的 hal API 版本创建一个新的 Camera 对象来访问特定的硬件摄像头。如果其他应用程序打开了同一个摄像头,或者此设备不支持该 hal API 版本,则会抛出 RuntimeException。
153    从 Android 12 开始,不再支持 HAL 版本 1。使用完摄像头后,您必须调用 release(),否则它将保持锁定状态,其他应用程序无法使用。
154    对于特定的硬件摄像头,您的应用程序一次只能激活一个 Camera 对象。来自其他方法的回调将传递到调用 open() 的线程的事件循环。
155    如果此线程没有事件循环,则回调将传递到主应用程序事件循环。如果没有主应用程序事件循环,则不会传递回调。
156    注意:在某些设备上,此方法可能需要很长时间才能完成。最好从工作线程(可能使用 android.os.AsyncTask)调用此方法,以避免阻塞主应用程序 UI 线程。
157    返回:一个新的 Camera 对象,已连接、已锁定且可供使用。
158    抛出:
159    - IllegalArgumentException – 如果 halVersion 无效
160    - RuntimeException – 如果打开摄像头失败(例如,如果摄像头正在被另一个进程使用或设备策略管理器已禁用摄像头)。
161    `camera_id` 要访问的硬件摄像头,介于 0 和 getNumberOfCameras()-1 之间。
162    `hal_version` 要打开的此摄像头设备的 HAL API 版本。
163    */
164    #[java_method]
165    pub fn open_legacy(camera_id: i32, hal_version: i32) -> Result<Self> {}
166
167    #[doc(hidden)]
168    #[java_method]
169    pub fn check_init_errors(err: i32) -> bool {}
170
171    #[doc(hidden)]
172    #[java_method]
173    pub fn open_uninitialized() -> Self {}
174
175    /**
176    断开并释放 Camera 对象资源。您必须在完成 Camera 对象使用后立即调用此方法。
177    */
178    #[java_method]
179    pub fn release(&self) {}
180
181    /**
182    解锁摄像头以允许其他进程访问它。通常,摄像头会锁定到具有活动 Camera 对象的进程,直到调用 release()。
183    为了允许进程之间快速切换,您可以调用此方法暂时释放摄像头以供其他进程使用;其他进程完成后,您可以调用 reconnect() 来回收摄像头。
184    必须在调用 android.media.MediaRecorder.setCamera(Camera) 之前完成此操作。录制开始后无法调用此方法。如果您没有录制视频,则可能不需要此方法。
185    抛出:RuntimeException – 如果无法解锁摄像头。
186    */
187    #[java_method]
188    pub fn unlock(&self) -> Result<()> {}
189
190    /**
191    重新锁定摄像头以防止其他进程访问它。除非调用 unlock(),否则摄像头对象默认处于锁定状态。通常使用 reconnect()。
192    从 API 级别 14 开始,android.media.MediaRecorder.start() 中的应用程序会自动锁定摄像头。应用程序可以在录制开始后使用摄像头(例如:缩放)。录制开始或停止后无需调用此方法。如果您没有录制视频,则可能不需要此方法。
193    抛出:RuntimeException – 如果无法重新锁定摄像头(例如,如果另一个进程仍在使用摄像头)。
194    */
195    #[java_method]
196    pub fn lock(&self) -> Result<()> {}
197
198    /**
199    在另一个进程使用摄像头服务后重新连接到该服务。调用 unlock() 后,另一个进程可以使用摄像头;当该进程完成后,您必须重新连接到摄像头,这将重新获取锁定并允许您继续使用摄像头。
200    从 API 级别 14 开始,android.media.MediaRecorder.start() 中的应用程序会自动锁定摄像头。应用程序可以在录制开始后使用摄像头(例如:缩放)。录制开始或停止后无需调用此方法。如果您没有录制视频,则可能不需要此方法。
201    抛出:
202    - IOException - 如果无法重新建立连接(例如,如果另一个进程仍在使用摄像头)。
203    - RuntimeException - 如果已在此 Camera 实例上调用 release()。
204    */
205    #[java_method]
206    pub fn reconnect(&self) -> Result<()> {}
207
208    /**
209    设置用于实时预览的 Surface。预览需要表面或表面纹理,而预览是拍照所必需的。
210    可以重新设置相同的表面而不会造成损害。设置预览表面将取消设置通过 setPreviewTexture 设置的任何预览表面纹理。
211    调用此方法时,SurfaceHolder 必须已包含表面。如果您使用的是 android.view.SurfaceView,则需要使用 SurfaceHolder.addCallback(SurfaceHolder.Callback) 注册 SurfaceHolder.Callback,并在调用 setPreviewDisplay() 或开始预览之前等待 SurfaceHolder.Callback.surfaceCreated(SurfaceHolder)。
212    此方法必须在 startPreview() 之前调用。一个例外是,如果在调用 startPreview() 之前未设置预览表面(或设置为 null),则可以使用非 null 参数调用此方法一次以设置预览表面。 (这允许相机设置和表面创建并行进行,从而节省时间。)预览运行时,预览表面可能不会发生变化。
213    抛出:
214    - IOException – 如果该方法失败(例如,如果表面不可用或不合适)。
215    - RuntimeException – 如果已在此 Camera 实例上调用 release()。
216    `holder` – 包含放置预览的表面,或 null 以删除预览表面
217    */
218    #[java_method]
219    pub fn set_preview_display<SH: SurfaceHolder>(&self, holder: Option<SH>) -> Result<()> {}
220
221    /**
222    抛出:IOException
223    */
224    #[java_method]
225    pub fn set_preview_surface(&self, surface: &Surface) -> Result<()> {}
226
227    /**
228    设置用于实时预览的 SurfaceTexture。预览需要表面或表面纹理,而预览需要拍照。可以重新设置相同的表面纹理而不会造成任何损害。
229    设置预览表面纹理将取消设置通过 setPreviewDisplay 设置的任何预览表面。此方法必须在 startPreview() 之前调用。唯一的例外是,如果在调用 startPreview() 之前未设置预览表面纹理(或将其设置为 null),则可以使用非 null 参数调用此方法一次以设置预览表面。(这允许并行进行相机设置和表面创建,从而节省时间。)
230    预览表面纹理在预览运行时可能不会发生变化。 SurfaceTexture.getTimestamp() 为设置为预览纹理的 SurfaceTexture 提供的时间戳具有未指定的零点,并且无法直接在不同的相机或同一相机的不同实例之间进行比较,也无法在同一程序的多次运行之间进行比较。
231    如果您使用预览数据来创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 来向用户正确指示图像捕获或录制开始/停止。
232    抛出:
233    - IOException – 如果该方法失败(例如,如果表面纹理不可用或不合适)。
234    - RuntimeException – 如果已在此 Camera 实例上调用 release()。
235    `surface_texture` 预览图像要发送到的 SurfaceTexture 或 null 以删除当前预览表面纹理
236    */
237    #[java_method]
238    pub fn set_preview_texture(&self, surface_texture: Option<&SurfaceTexture>) -> Result<()> {}
239
240    //noinspection SpellCheckingInspection
241    /**
242    开始捕获预览帧并将其绘制到屏幕上。在使用 setPreviewDisplay(SurfaceHolder) 或 setPreviewTexture(SurfaceTexture) 提供表面之前,预览不会真正开始。
243    如果调用了 setPreviewCallback(Camera.PreviewCallback)、setOneShotPreviewCallback(Camera.PreviewCallback) 或 setPreviewCallbackWithBuffer(Camera.PreviewCallback),则在预览数据可用时将调用 Camera.PreviewCallback.onPreviewFrame(byte[], Camera)。
244    抛出:RuntimeException – 如果启动预览失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。setPreviewSize 和 setPictureSize 中提到的 QCIF (176x144) 异常也可能导致抛出此异常。
245    */
246    #[java_method]
247    pub fn start_preview(&self) -> Result<()> {}
248
249    /**
250    停止捕获和将预览帧绘制到表面,并重置相机以便将来调用 startPreview()。
251    抛出:RuntimeException – 如果停止预览失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
252    */
253    #[java_method]
254    pub fn stop_preview(&self) -> Result<()> {}
255
256    /**
257    返回当前预览状态。
258    FIXME:发布前取消隐藏
259    */
260    #[java_method]
261    pub fn preview_enabled(&self) -> bool {}
262
263    /**
264    安装一个回调,用于在屏幕上显示每个预览帧并调用它们。只要预览处于活动状态,就会重复调用回调。
265    此方法可随时调用,即使预览处于活动状态。任何其他预览回调都将被覆盖。
266    如果您使用预览数据创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 向用户正确指示图像捕获或录制开始/停止。
267    抛出:RuntimeException – 如果已在此 Camera 实例上调用 release()。
268    `cb` 一个回调对象,用于接收每个预览帧的副本,或 null 以停止接收回调。
269    */
270    #[java_method]
271    pub fn set_preview_callback<C: Camera_PreviewCallback>(&self, cb: Option<C>) -> Result<()> {}
272
273    /**
274    除了在屏幕上显示下一个预览帧外,还安装一个回调函数,用于调用该回调函数来获取下一个预览帧。调用一次后,回调函数将被清除。
275    此方法可随时调用,即使预览处于实时状态。任何其他预览回调函数都将被覆盖。
276    如果您使用预览数据来创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 来向用户正确指示图像捕获或录制开始/停止。
277    抛出:RuntimeException – 如果已在此 Camera 实例上调用 release()。
278    `cb` 一个回调对象,用于接收下一个预览帧的副本,或 null 以停止接收回调函数。
279    */
280    #[java_method]
281    pub fn set_one_shot_preview_callback<C: Camera_PreviewCallback>(
282        &self,
283        cb: Option<C>,
284    ) -> Result<()> {
285    }
286
287    /**
288    安装一个回调函数,使用 addCallbackBuffer(byte[]) 提供的缓冲区为每个预览帧调用该回调函数,并将它们显示在屏幕上。
289    只要预览处于活动状态且缓冲区可用,就会重复调用回调函数。任何其他预览回调函数都将被覆盖。
290    此方法的目的是通过允许预览帧内存重用来提高预览效率和帧速率。您必须在某个时间点(在调用此方法之前或之后)调用 addCallbackBuffer(byte[]),否则将不会收到任何回调函数。
291    如果使用空回调函数调用此方法、调用 setPreviewCallback(Camera.PreviewCallback) 或调用 setOneShotPreviewCallback(Camera.PreviewCallback),则缓冲区队列将被清除。
292    如果您使用预览数据创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 向用户正确指示图像捕获或录制开始/停止。
293    抛出:RuntimeException – 如果已在此 Camera 实例上调用 release()。
294    `cb` 一个接收预览帧副本的回调对象,或 null 以停止接收回调并清除缓冲区队列。
295    */
296    #[java_method]
297    pub fn set_preview_callback_with_buffer<C: Camera_PreviewCallback>(
298        &self,
299        cb: Option<C>,
300    ) -> Result<()> {
301    }
302
303    /**
304    将预分配的缓冲区添加到预览回调缓冲区队列。应用程序可以向队列添加一个或多个缓冲区。当预览帧到达且至少有一个可用缓冲区时,将使用该缓冲区并将其从队列中删除。
305    然后使用该缓冲区调用预览回调。如果帧到达且没有剩余缓冲区,则丢弃该帧。
306    应用程序应在完成处理缓冲区中的数据后将其添加回去。对于 YV12 以外的格式,缓冲区的大小由预览图像宽度、高度和每像素字节数相乘来确定。
307    宽度和高度可以从 Camera.Parameters.getPreviewSize() 中读取。可以使用 Camera.Parameters.getPreviewFormat() 中的图像格式,从 ImageFormat.getBitsPerPixel(int)/8 计算每像素字节数。
308    如果使用 ImageFormat.YV12 格式,则可以使用 Camera.Parameters.setPreviewFormat 中列出的公式计算大小。仅当使用 setPreviewCallbackWithBuffer(Camera.PreviewCallback) 时才需要此方法。
309    使用 setPreviewCallback(Camera.PreviewCallback) 或 setOneShotPreviewCallback(Camera.PreviewCallback) 时,会自动分配缓冲区。当提供的缓冲区太小而无法容纳预览帧数据时,预览回调将返回 null,并且缓冲区将从缓冲区队列中删除。
310    `callback_buffer` 是要添加到队列的缓冲区。缓冲区的大小必须与上面描述的值匹配。
311    */
312    #[java_method]
313    pub fn add_callback_buffer(&self, callback_buffer: &[u8]) {}
314
315    /**
316    将预分配的缓冲区添加到原始图像回调缓冲区队列。应用程序可以向队列添加一个或多个缓冲区。
317    当原始图像帧到达且至少有一个可用缓冲区时,该缓冲区将用于保存原始图像数据并从队列中删除。然后使用缓冲区调用原始图像回调。
318    如果原始图像帧到达但没有剩余缓冲区,则丢弃该帧。应用程序应在完成处理缓冲区中的数据后通过再次调用此方法重新添加缓冲区,以避免耗尽原始图像回调缓冲区。
319    缓冲区的大小由原始图像宽度、高度和每像素字节数相乘确定。宽度和高度可以从 Camera.Parameters.getPictureSize() 中读取。
320    每像素字节数可以从 ImageFormat.getBitsPerPixel(int)/8 计算,使用 Camera.Parameters.getPreviewFormat() 中的图像格式。仅当在调用 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) 时使用原始图像的 PictureCallback 时,才需要此方法。
321    请注意,通过调用此方法,将触发应用程序管理的回调缓冲区模式。如果从未调用过此方法,则原始图像回调将返回 null,因为没有可用的图像回调缓冲区。
322    此外,当提供的缓冲区太小而无法容纳原始图像数据时,原始图像回调将返回 null,并且缓冲区将从缓冲区队列中删除。
323    `callback_buffer` 是要添加到原始图像回调缓冲区队列的缓冲区。大小应为宽度 * 高度 *(每像素位数)/ 8。null 的回调缓冲区将被忽略,不会添加到队列中。
324    */
325    #[java_method]
326    pub fn add_raw_image_callback_buffer(&self, callback_buffer: &[u8]) {}
327
328    /**
329    创建 RenderScript 分配以用作预览回调帧的目标。使用 setPreviewCallbackAllocation 将创建的分配用作相机预览帧的目标。
330    分配将使用 YUV 类型创建,并且必须使用 rsGetElementAtYuv_* 访问器方法在 RenderScript 中访问其内容。其大小将基于为此相机配置的当前预览大小。
331    返回:尺寸等于当前预览大小的新 YUV 类型分配。
332    抛出:RSIllegalArgumentException - 如果使用标志与 YUV 分配不兼容。
333    `rs` 此分配的 RenderScript 上下文。
334    `usage` 为分配设置的其他使用标志。使用标志 Allocation.USAGE_IO_INPUT 将始终设置在创建的分配上,但可以在此处提供其他标志。
335    */
336    #[java_method]
337    pub fn create_preview_allocation(&self, rs: &RenderScript, usage: i32) -> Result<Allocation> {}
338
339    /**
340    将 Allocation 设置为预览回调数据的目标。使用此方法可以高效地处理带有 RenderScript 的相机预览数据。
341    必须使用 createPreviewAllocation 方法创建 Allocation。设置预览分配将禁用由 setPreviewCallback 或 setPreviewCallbackWithBuffer 设置的任何活动预览回调,反之亦然。
342    使用预览分配仍需要设置活动的标准预览目标,使用 setPreviewTexture 或 setPreviewDisplay。要在 Allocation 有新帧可用时收到通知,请使用 Allocation.setIoInputNotificationHandler。
343    要将当前可从 Allocation 访问的帧更新为最新的预览帧,请调用 Allocation.ioReceive。要禁用 Allocation 中的预览,请使用 null 参数调用此方法。
344    一旦设置了预览分配,setPreviewSize 设置的预览大小就无法更改。如果您希望更改预览大小,请先通过调用 setPreviewCallbackAllocation(null) 删除预览分配,然后更改预览大小,使用 createPreviewAllocation 创建新的预览分配,并将其设置为新的预览回调分配目标。
345    如果您使用预览数据创建视频或静态图像,强烈建议使用 android.media.MediaActionSound 向用户正确指示图像捕获或录制开始/停止。
346    抛出:IOException – 如果配置相机以使用分配进行预览失败。 IllegalArgumentException – 如果分配的尺寸或其他参数不符合要求。
347    `preview_allocation` 用作预览目标的分配
348    */
349    #[java_method]
350    pub fn set_preview_callback_allocation(
351        &self,
352        preview_allocation: Option<&Allocation>,
353    ) -> Result<()> {
354    }
355
356    /**
357    启动相机自动对焦并注册一个回调函数,以便在相机对焦时运行。此方法仅在预览处于活动状态时有效(在 startPreview() 之间和 stopPreview() 之前)。
358    调用者应检查 android.hardware.Camera.Parameters.getFocusMode() 以确定是否应调用此方法。如果相机不支持自动对焦,则为无操作,并且将立即调用 Camera.AutoFocusCallback.onAutoFocus(boolean, Camera) 回调。
359    如果您的应用程序不应安装在没有自动对焦功能的设备上,则必须使用 清单元素声明您的应用程序使用自动对焦。如果当前闪光灯模式不是 android.hardware.Camera.Parameters.FLASH_MODE_OFF,则闪光灯可能会在自动对焦期间触发,具体取决于驱动程序和相机硬件。
360    自动曝光锁 android.hardware.Camera.Parameters.getAutoExposureLock() 和自动白平衡锁 android.hardware.Camera.Parameters.getAutoWhiteBalanceLock() 在自动对焦期间和之后不会改变。但自动对焦例程可能会在对焦期间暂时停止自动曝光和自动白平衡。
361    使用 stopPreview() 停止预览,或使用 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback) 触发静态图像捕获,不会改变焦点位置。应用程序必须调用 cancelAutoFocus 来重置焦点。
362    如果自动对焦成功,请考虑使用 android.media.MediaActionSound 向用户正确播放自动对焦成功声音。
363    抛出:RuntimeException – 如果启动自动对焦失败;通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
364    `cb` 要运行的回调
365    */
366    #[java_method]
367    pub fn auto_focus<C: Camera_AutoFocusCallback>(&self, cb: &C) -> Result<()> {}
368
369    /**
370    取消正在进行的任何自动对焦功能。无论自动对焦当前是否正在进行,此函数都会将焦点位置返回到默认值。
371    如果相机不支持自动对焦,则此操作无效。
372    抛出:RuntimeException – 如果取消自动对焦失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
373    */
374    #[java_method]
375    pub fn cancel_auto_focus(&self) -> Result<()> {}
376
377    /**
378    设置相机自动对焦移动回调。
379    抛出:RuntimeException – 如果启用对焦移动回调失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
380    `cb` 要运行的回调
381    */
382    #[java_method]
383    pub fn set_auto_focus_move_callback<C: Camera_AutoFocusMoveCallback>(&self, cb: &C) {}
384
385    /**
386    相当于 takePicture(Shutter, raw, null, jpeg)。
387    */
388    #[java_method(overload = takePicture)]
389    pub fn take_picture_convenience<C: Camera_ShutterCallback, D: Camera_PictureCallback>(
390        &self,
391        shutter: Option<&C>,
392        raw: Option<&D>,
393        jpeg: Option<&D>,
394    ) -> Result<()> {
395    }
396
397    /**
398    触发异步图像捕获。相机服务将在图像捕获过程中向应用程序发起一系列回调。
399    快门回调发生在图像捕获后。这可用于触发声音,让用户知道图像已捕获。
400    原始回调发生在原始图像数据可用时(注意:如果没有可用的原始图像回调缓冲区或原始图像回调缓冲区不足以容纳原始图像,则数据将为空)。
401    后视图回调发生在缩放的、完全处理的后视图图像可用时(注意:并非所有硬件都支持此功能)。
402    jpeg 回调发生在压缩图像可用时。如果应用程序不需要特定的回调,则可以传递 null 而不是回调方法。
403    此方法仅在预览处于活动状态时有效(在 startPreview() 之后)。拍摄图像后将停止预览;如果调用者想要重新启动预览或拍摄更多照片,则必须再次调用 startPreview()。
404    不应在 android.media.MediaRecorder.start() 和 android.media.MediaRecorder.stop() 之间调用此方法。调用此方法后,在 JPEG 回调返回之前,您不得调用 startPreview() 或拍摄另一张照片。
405    抛出:RuntimeException – 如果开始图片捕获失败;这通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
406    `shutter` 图像捕获时刻的回调,或为 null
407    `raw` 原始(未压缩)图像数据的回调,或为 null
408    `post_view` 带有 post_view 图像数据的回调,可能为 null
409    `jpeg` JPEG 图像数据的回调,或为 null
410    */
411    #[java_method]
412    pub fn take_picture<C: Camera_ShutterCallback, D: Camera_PictureCallback>(
413        &self,
414        shutter: Option<&C>,
415        raw: Option<&D>,
416        post_view: Option<&D>,
417        jpeg: Option<&D>,
418    ) -> Result<()> {
419    }
420
421    /**
422    平稳缩放到请求的值。驱动程序将通知 Camera.OnZoomChangeListener 缩放值以及缩放是否在此时停止。
423    例如,假设当前缩放为 0,并使用值 3 调用 startSmoothZoom。Camera.OnZoomChangeListener.onZoomChange(int, boolean, Camera) 方法将被调用三次,缩放值分别为 1、2 和 3。
424    应用程序可以调用 stopSmoothZoom 以提前停止缩放。应用程序不应在缩放停止前再次调用 startSmoothZoom 或更改缩放值。
425    如果提供的缩放值等于当前缩放值,则不会生成缩放回调。如果 android.hardware.Camera.Parameters.isSmoothZoomSupported 返回 true,则支持此方法。
426    抛出:
427    - IllegalArgumentException – 如果缩放值无效。
428    - RuntimeException – 如果方法失败。
429    `value` 缩放值。有效范围为 0 到 android.hardware.Camera.Parameters.getMaxZoom。
430    */
431    #[java_method]
432    pub fn start_smooth_zoom(&self, value: i32) -> Result<()> {}
433
434    /**
435    停止平滑缩放。应用程序应等待 Camera.OnZoomChangeListener 来获知缩放何时真正停止。
436    如果 android.hardware.Camera.Parameters.isSmoothZoomSupported 为 true,则支持此方法。
437    抛出:RuntimeException – 如果该方法失败。
438    */
439    #[java_method]
440    pub fn stop_smooth_zoom(&self) -> Result<()> {}
441
442    /**
443    设置预览显示的顺时针旋转度数。这会影响预览帧和快照后显示的图片。此方法对于人像模式应用很有用。
444    请注意,前置摄像头的预览显示在旋转之前会水平翻转,即图像沿摄像头传感器的中心垂直轴反射。因此用户可以看到自己就像在看镜子一样。
445    这不会影响在 Camera.PreviewCallback.onPreviewFrame、JPEG 图片或录制的视频中传递的字节数组的顺序。不允许在预览期间调用此方法。
446    如果要使相机图像以与显示屏相同的方向显示,可以使用以下代码。
447    ```java
448    public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) {
449        android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
450        android.hardware.Camera.getCameraInfo(cameraId, info);
451        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
452        int degrees = 0;
453        switch (rotation) {
454          case Surface.ROTATION_0:
455            degrees = 0;
456            break;
457          case Surface.ROTATION_90:
458            degrees = 90;
459            break;
460          case Surface.ROTATION_180:
461            degrees = 180;
462            break;
463          case Surface.ROTATION_270:
464            degrees = 270;
465            break;
466        }
467        int result;
468        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
469            result = (info.orientation + degrees) % 360;
470            result = (360 - result) % 360;  // 补偿镜子
471        } else {
472            // 背面
473            result = (info.orientation - degrees + 360) % 360;
474        }
475        camera.setDisplayOrientation(result);
476    }
477    ```
478    从 API 级别 14 开始,可以在预览处于活动状态时调用此方法。注意:在 API 级别 24 之前,方向的默认值为 0。
479    从 API 级别 24 开始,默认方向将是这样的,即强制横向模式下的应用程序将具有正确的预览方向,该方向可以是默认值 0 或 180。在纵向模式下运行或允许更改方向的应用程序仍必须在每次方向更改后调用此方法,以确保在所有情况下都能正确显示预览。
480    抛出:RuntimeException - 如果设置方向失败;通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
481    `degrees` 图片顺时针旋转的角度。有效值为 0、90、180 和 270。
482    */
483    #[java_method]
484    pub fn set_display_orientation(&self, degrees: i32) -> Result<()> {}
485
486    /**
487    启用或禁用拍照时的默认快门声音。默认情况下,调用 takePicture 时,相机会播放系统定义的相机快门声音。
488    使用此方法可以禁用快门声音。强烈建议在禁用系统快门声音时在 Camera.ShutterCallback 中播放替代快门声音。
489    请注意,设备可能并不总是允许禁用相机快门声音。如果无法将快门声音状态设置为所需值,则此方法将返回 false。
490    Camera.CameraInfo.canDisableShutterSound 可用于确定设备是否允许禁用快门声音。
491    返回:如果成功更改了快门声音状态,则返回 true。如果无法更改快门声音状态,则返回 false。如果快门声音播放已设置为请求的状态,也会返回 true。
492    抛出:RuntimeException – 如果调用失败;通常是由于硬件或其他低级错误,或者因为已在此 Camera 实例上调用 release()。
493    `enabled` 调用 takePicture 时相机是否应播放系统快门声音。
494    */
495    #[java_method]
496    pub fn enable_shutter_sound(&self, enabled: bool) -> Result<bool> {}
497
498    /**
499    无条件禁用快门声音。这只保证适用于旧式相机(即使用 cameraInitUnspecified 初始化的相机)。
500    尝试在普通相机上调用此功能将强制在相机服务中进行条件检查。
501    返回:如果成功更改了快门声音状态,则返回 true。如果无法更改快门声音状态,则返回 false。如果快门声音播放已设置为请求的状态,也会返回 true。
502    */
503    #[java_method]
504    pub fn disable_shutter_sound(&self) -> bool {}
505
506    /**
507    注册一个监听器,以便在平滑变焦期间相机驱动程序更新变焦值时收到通知。
508    `listener` 要通知的监听器
509    */
510    #[java_method]
511    pub fn set_zoom_change_listener<L: Camera_OnZoomChangeListener>(&self, listener: &L) {}
512
513    /**
514    注册一个侦听器,以便接收有关预览帧中检测到的面部的通知。
515    `listener` 要通知的侦听器
516    */
517    #[java_method]
518    pub fn set_face_detection_listener<L: Camera_FaceDetectionListener>(&self, listener: &L) {}
519
520    /**
521    开始人脸检测。应在预览启动后调用此方法。相机将通知 Camera.FaceDetectionListener 预览帧中检测到的人脸。
522    检测到的人脸可能与之前的相同。应用程序应调用 stopFaceDetection 来停止人脸检测。如果 Camera.Parameters.getMaxNumDetectedFaces() 返回大于 0 的数字,则支持此方法。
523    如果人脸检测已启动,应用程序不应再次调用此方法。 当人脸检测正在运行时,Camera.Parameters.setWhiteBalance(String)、Camera.Parameters.setFocusAreas(List) 和 Camera.Parameters.setMeteringAreas(List) 不起作用。
524    相机使用检测到的人脸进行自动白平衡、自动曝光和自动对焦。 如果应用程序调用 autoFocus(Camera.AutoFocusCallback),相机将停止发送人脸回调。
525    最后一个人脸回调指示用于进行自动对焦的区域。对焦完成后,人脸检测将恢复发送人脸回调。如果应用调用 cancelAutoFocus(),人脸回调也将恢复。
526    调用 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback) 或 stopPreview() 后,再使用 startPreview() 恢复预览,应用应再次调用此方法以恢复人脸检测。
527    抛出:
528    - IllegalArgumentException – 如果不支持人脸检测。
529    - RuntimeException – 如果方法失败或人脸检测已在运行。
530    */
531    #[java_method]
532    pub fn start_face_detection(&self) -> Result<()> {}
533
534    /**
535    停止人脸检测。
536    */
537    #[java_method]
538    pub fn stop_face_detection(&self) {}
539
540    /**
541    注册一个在发生错误时调用的回调。
542    `cb` 要运行的回调
543    */
544    #[java_method]
545    pub fn set_error_callback<C: Camera_ErrorCallback>(&self, cb: &C) {}
546
547    /**
548    注册一个在发生错误时调用的回调。详细的错误回调可能包含错误代码,提供有关错误的更多详细信息。设置详细回调后,通过 #setErrorCallback(ErrorCallback) 设置的回调将停止接收 onError 调用。
549    `cb` 要运行的回调
550    */
551    #[java_method]
552    pub fn set_detailed_error_callback<C: Camera_ErrorCallback>(&self, cb: &C) {}
553
554    /**
555    更改此相机服务的设置。
556    抛出:RuntimeException – 如果任何参数无效或不受支持。
557    `params` 此相机服务要使用的参数
558    */
559    #[java_method]
560    pub fn set_parameters(&self, params: Camera_Parameters) -> Result<()> {}
561
562    /**
563    返回此相机服务的当前设置。如果对返回的参数进行了修改,则必须将其传递给 setParameters(Camera.Parameters) 才能生效。
564    抛出:RuntimeException – 如果读取参数失败;这通常是由于硬件或其他低级错误,或者因为已在此相机实例上调用 release()。
565    */
566    #[java_method]
567    pub fn get_parameters(&self) -> Result<Camera_Parameters> {}
568
569    /**
570    返回一个空的 Camera.Parameters 以用于测试目的。
571    返回:一个参数对象。
572    */
573    #[java_method]
574    pub fn get_empty_parameters() -> Camera_Parameters {}
575
576    /**
577    返回一个复制的 Camera.Parameters;仅供 shim 使用。
578    返回:一个 Parameter 对象,所有参数均从参数中复制而来。
579    抛出:NullPointerException – 如果参数为空
580    `parameters` 一个非空参数
581    */
582    #[java_method]
583    pub fn get_parameters_copy(parameters: &Camera_Parameters) -> Result<Camera_Parameters> {}
584
585    /**
586    设置相机音频限制模式。
587    */
588    #[java_method]
589    pub fn set_audio_restriction(&self, mode: i32) {}
590
591    /**
592    获取当前应用的相机音频限制模式。
593    */
594    #[java_method]
595    pub fn get_audio_restriction(&self) -> i32 {}
596}
597
598/**
599用于在显示预览帧时提供其副本的回调接口。
600*/
601#[allow(non_camel_case_types)]
602#[deprecated(note = "我们建议对新应用程序使用新的 android.hardware.camera2 API。")]
603#[java_interface(name = "android/hardware/Camera$PreviewCallback")]
604pub trait Camera_PreviewCallback {
605    /**
606    在显示预览帧时调用。此回调在调用 open(int) 的事件线程上调用。
607    如果使用 ImageFormat.YV12 格式,请参阅 Camera.Parameters.setPreviewFormat 中的公式,了解预览回调缓冲区中像素数据的排列。
608    `data` 是预览帧的内容,格式由 ImageFormat 定义,可以使用 android.hardware.Camera.Parameters.getPreviewFormat() 进行查询。如果从未调用 android.hardware.Camera.Parameters.setPreviewFormat(int),则默认为 YCbCr_420_SP (NV21) 格式。
609    `camera` 是相机服务对象。
610    */
611    fn on_preview_frame(&self, data: &[u8], camera: &Camera);
612}
613
614/**
615用于通知相机自动对焦完成的回调接口。不支持自动对焦的设备将收到对此接口的“假”回调。
616如果您的应用需要自动对焦,并且不应安装在没有自动对焦的设备上,则您必须在 清单元素中声明您的应用使用 android.hardware.camera.autofocus 功能。
617*/
618#[allow(non_camel_case_types)]
619#[deprecated(note = "我们建议对新应用使用新的 android.hardware.camera2 API。")]
620#[java_interface(name = "android/hardware/Camera$AutoFocusCallback")]
621pub trait Camera_AutoFocusCallback {
622    /**
623    当相机自动对焦完成时调用。如果相机不支持自动对焦并且调用了 autoFocus,则将立即调用 onAutoFocus,并将 false 值 success 设置为 true。
624    自动对焦例程完成后不会锁定自动曝光和自动白平衡。
625    `success` 如果对焦成功,则为 true,否则为 false
626    `camera` 相机服务对象
627    */
628    fn on_auto_focus(&self, success: bool, camera: &Camera);
629}
630
631/**
632用于通知自动对焦开始和停止的回调接口。这仅在连续自动对焦模式下受支持 - Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO 和 Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE。
633应用程序可以在此基础上显示自动对焦动画。
634*/
635#[allow(non_camel_case_types)]
636#[deprecated(note = "我们建议新应用程序使用新的 android.hardware.camera2 API。")]
637#[java_interface(name = "android/hardware/Camera$AutoFocusMoveCallback")]
638pub trait Camera_AutoFocusMoveCallback {
639    /**
640    当相机自动对焦开始或停止时调用。
641    `start` 如果焦点开始移动则为 true,如果焦点停止移动则为 false
642    `camera` 相机服务对象
643    */
644    fn on_auto_focus_moving(&self, start: bool, camera: &Camera);
645}
646
647/**
648用于发出实际图像捕获时刻信号的回调接口。
649*/
650#[allow(non_camel_case_types)]
651#[deprecated(note = "我们建议在新应用中使用新的 android.hardware.camera2 API。")]
652#[java_interface(name = "android/hardware/Camera$ShutterCallback")]
653pub trait Camera_ShutterCallback {
654    /**
655    尽可能在照片从传感器捕获时调用。这是播放快门声音或提供相机操作的其他反馈的好机会。
656    这可能发生在照片触发后的某个时间,但在实际数据可用之前的某个时间。
657    */
658    fn on_shutter(&self);
659}
660
661/**
662用于提供照片捕获图像数据的回调接口。
663*/
664#[deprecated(note = "我们建议在新应用程序中使用新的 android.hardware.camera2 API。")]
665#[allow(non_camel_case_types)]
666#[java_interface(name = "android/hardware/Camera$PictureCallback")]
667pub trait Camera_PictureCallback {
668    /**
669    拍摄照片后,当图像数据可用时调用。数据的格式取决于回调上下文和 Camera.Parameters 设置。
670    `data` 图像数据的字节数组 camera – Camera 服务对象
671    */
672    fn on_picture_taken(&self, data: &[u8], camera: &Camera);
673}
674
675/**
676平滑缩放操作期间缩放变化的回调接口。
677*/
678#[allow(non_camel_case_types)]
679#[deprecated(note = "我们建议新应用使用新的 android.hardware.camera2 API。")]
680#[java_interface(name = "android/hardware/Camera$OnZoomChangeListener")]
681pub trait Camera_OnZoomChangeListener {
682    /**
683    在平滑缩放期间缩放值发生变化时调用。
684    `zoom_value` 当前缩放值。在平滑缩放模式下,相机会为每个新的 缩放值调用此函数。
685    `stopped` 平滑缩放是否停止。如果值为 true,则这是应用程序的-最后一次缩放更新。
686    `camera` 相机服务对象
687    */
688    fn on_zoom_change(&self, zoom_value: i32, stopped: bool, camera: &Camera);
689}
690
691/**
692预览框中检测到人脸的回调接口。
693*/
694#[allow(non_camel_case_types)]
695#[deprecated(note = "我们建议新应用使用新的 android.hardware.camera2 API。")]
696#[java_interface(name = "android/hardware/Camera$FaceDetectionListener")]
697pub trait Camera_FaceDetectionListener {
698    /**
699    通知侦听器在预览帧中检测到的脸部。
700    `faces` 列表中检测到的脸部
701    `camera` 相机服务对象
702    */
703    fn on_face_detection(&self, faces: &[Camera_Face], camera: &Camera);
704}
705
706/**
707通过相机人脸检测识别的人脸信息。当使用相机进行人脸检测时,Camera.FaceDetectionListener 将返回用于对焦和测光的人脸对象列表。
708*/
709#[allow(non_camel_case_types)]
710#[deprecated(note = "我们建议在新应用中使用新的 android.hardware.camera2 API。")]
711#[java_class(name = "android/hardware/Camera$Face")]
712pub struct Camera_Face;
713
714impl Camera_Face {
715    /**
716    創建一個空的臉。
717    */
718    #[java_constructor]
719    pub fn new() -> Self {}
720
721    /**
722    获取面部的边界。(-1000, -1000) 表示相机视野的左上角,(1000, 1000) 表示视野的右下角。
723    例如,假设取景器 UI 的大小为 800x480。从驱动程序传递的矩形为 (-1000, -1000, 0, 0)。相应的取景器矩形应为 (0, 0, 400, 240)。保证左 < 右且上 < 下。
724    坐标可以小于 -1000 或大于 1000。但至少一个顶点位于 (-1000, -1000) 和 (1000, 1000) 之间。
725    方向相对于传感器方向,即传感器所见的方向。方向不受 setDisplayOrientation(int) 的旋转或镜像的影响。
726    面部边界矩形不提供任何有关面部方向的信息。这是将驱动程序坐标转换为像素中的视图坐标的矩阵。
727    ```java
728    Matrix matrix = new Matrix();
729    CameraInfo info = CameraHolder.instance().getCameraInfo()[cameraId];
730    // 前置摄像头需要镜子。
731    boolean mirror = (info.facing == CameraInfo.CAMERA_FACING_FRONT);
732    matrix.setScale(mirror ? -1 : 1, 1);
733    // 这是 android.hardware.Camera.setDisplayOrientation 的值。
734    matrix.postRotate(displayOrientation);
735    // 摄像头驱动程序坐标范围从 (-1000, -1000) 到 (1000, 1000)。
736    // UI 坐标范围从 (0, 0) 到 (width, height)。
737    matrix.postScale(view.getWidth()/2000f,view.getHeight()/2000f);
738    matrix.postTranslate(view.getWidth()/2f,view.getHeight()/2f);
739    ```
740    */
741    #[java_field]
742    pub fn get_rect(&self) -> Rect {}
743
744    /**
745    设置面部的边界。(-1000, -1000) 表示相机视野的左上角,(1000, 1000) 表示视野的右下角。
746    例如,假设取景器 UI 的大小为 800x480。从驱动程序传递的矩形为 (-1000, -1000, 0, 0)。相应的取景器矩形应为 (0, 0, 400, 240)。保证左 < 右且上 < 下。
747    坐标可以小于 -1000 或大于 1000。但至少一个顶点位于 (-1000, -1000) 和 (1000, 1000) 之间。
748    方向相对于传感器方向,即传感器所见的方向。方向不受 setDisplayOrientation(int) 的旋转或镜像的影响。
749    面部边界矩形不提供任何有关面部方向的信息。这是将驱动程序坐标转换为像素中的视图坐标的矩阵。
750    ```java
751    Matrix matrix = new Matrix();
752    CameraInfo info = CameraHolder.instance().getCameraInfo()[cameraId];
753    // 前置摄像头需要镜子。
754    boolean mirror = (info.facing == CameraInfo.CAMERA_FACING_FRONT);
755    matrix.setScale(mirror ? -1 : 1, 1);
756    // 这是 android.hardware.Camera.setDisplayOrientation 的值。
757    matrix.postRotate(displayOrientation);
758    // 摄像头驱动程序坐标范围从 (-1000, -1000) 到 (1000, 1000)。
759    // UI 坐标范围从 (0, 0) 到 (width, height)。
760    matrix.postScale(view.getWidth()/2000f,view.getHeight()/2000f);
761    matrix.postTranslate(view.getWidth()/2f,view.getHeight()/2f);
762    ```
763    */
764    #[java_field]
765    pub fn set_rect(&self, value: &Rect) {}
766
767    /**
768    获取人脸检测的置信度。范围是 1 到 100。100 表示置信度最高。
769    根据设备的不同,甚至可能列出置信度非常低的人脸,因此应用程序应根据用例过滤掉置信度低的人脸。
770    对于希望在检测到的人脸周围显示矩形的典型傻瓜相机应用程序,建议过滤掉置信度低于 50 的人脸。
771    */
772    #[java_field]
773    pub fn get_score(&self) -> i32 {}
774
775    /**
776    设置人脸检测的置信度。范围是 1 到 100。100 表示置信度最高。
777    根据设备的不同,甚至可能列出置信度非常低的人脸,因此应用程序应根据用例过滤掉置信度低的人脸。
778    对于希望在检测到的人脸周围显示矩形的典型傻瓜相机应用程序,建议过滤掉置信度低于 50 的人脸。
779    */
780    #[java_field]
781    pub fn set_score(&self, value: i32) {}
782
783    /**
784    当人脸对跟踪器可见时,每个人脸都有一个唯一的 ID。如果人脸离开视野后又回来,它将获得一个新的 ID。
785    这是一个可选字段,可能并非所有设备都支持。如果不支持,ID 将始终设置为 -1。可选字段作为一组支持。要么它们全部有效,要么它们都无效。
786    */
787    #[java_field(default_value = -1)]
788    pub fn get_id(&self) -> i32 {}
789
790    /**
791    当人脸对跟踪器可见时,每个人脸都有一个唯一的 ID。如果人脸离开视野后又回来,它将获得一个新的 ID。
792    这是一个可选字段,可能并非所有设备都支持。如果不支持,ID 将始终设置为 -1。可选字段作为一组支持。要么它们全部有效,要么它们都无效。
793    */
794    #[java_field]
795    pub fn set_id(&self, value: i32) {}
796
797    /**
798    获取左眼中心的坐标。坐标与矩形的坐标位于同一空间。这是一个可选字段,可能并非所有设备都支持。如果不支持,则该值将始终设置为 null。可选字段以集合形式受支持。要么全部有效,要么全部无效。
799    */
800    #[java_field(default_value = None)]
801    pub fn get_left_eye(&self) -> Option<Point> {}
802
803    /**
804    设置左眼中心的坐标。坐标与矩形的坐标位于同一空间。这是一个可选字段,可能并非所有设备都支持。如果不支持,则该值将始终设置为 null。可选字段以集合形式受支持。要么全部有效,要么全部无效。
805    */
806    #[java_field]
807    pub fn set_left_eye(&self, value: Option<&Point>) {}
808
809    /**
810    获取右眼中心的坐标。该坐标与矩形的坐标位于同一空间。这是一个可选字段,可能并非所有设备都支持。如果不支持,则该值将始终设置为 null。可选字段以集合形式受支持。要么全部有效,要么全部无效。
811    */
812    #[java_field(default_value = None)]
813    pub fn get_right_eye(&self) -> Option<Point> {}
814
815    /**
816    设置右眼中心的坐标。该坐标与矩形的坐标位于同一空间。这是一个可选字段,可能并非所有设备都支持。如果不支持,则该值将始终设置为 null。可选字段以集合形式受支持。要么全部有效,要么全部无效。
817    */
818    #[java_field]
819    pub fn set_right_eye(&self, value: Option<&Point>) {}
820
821    /**
822    获取嘴部中心的坐标。坐标与矩形的坐标位于同一空间。这是一个可选字段,可能并非所有设备都支持。如果不支持,则该值将始终设置为 null。可选字段以集合形式受支持。要么全部有效,要么全部无效。
823    */
824    #[java_field(default_value = None)]
825    pub fn get_mouth(&self) -> Option<Point> {}
826
827    /**
828    设置嘴部中心的坐标。坐标与矩形的坐标位于同一空间。这是一个可选字段,可能并非所有设备都支持。如果不支持,则该值将始终设置为 null。可选字段以集合形式受支持。要么全部有效,要么全部无效。
829    */
830    #[java_field]
831    pub fn set_mouth(&self, value: Option<&Point>) {}
832}
833
834/**
835相机错误通知的回调接口。
836*/
837#[deprecated(note = "我们建议新应用使用新的android.hardware.camera2 API。")]
838#[allow(non_camel_case_types)]
839#[java_interface(name = "android/hardware/Camera$ErrorCallback")]
840pub trait Camera_ErrorCallback {
841    /**
842    相机错误回调。
843    `error` 错误代码:CAMERA_ERROR_UNKNOWN、CAMERA_ERROR_SERVER_DIED
844    `camera` 相机服务对象
845    */
846    fn on_error(&self, error: i32, camera: &Camera);
847}
848
849/**
850相机服务设置。要使相机参数生效,应用程序必须调用 setParameters(Camera.Parameters)。
851例如,在调用 setWhiteBalance 后,直到使用更改后的参数对象调用 setParameters(Camera.Parameters),白平衡才会真正改变。不同的设备可能具有不同的相机功能,例如图片大小或闪光模式。
852应用程序应在设置参数之前查询相机功能。例如,应用程序应在调用 setColorEffect(String) 之前调用 getSupportedColorEffects()。
853如果相机不支持色彩效果,getSupportedColorEffects() 将返回 null。
854*/
855#[allow(non_camel_case_types)]
856#[deprecated(note = "我们建议新应用程序使用新的 android.hardware.camera2 API。")]
857#[java_class(name = "android/hardware/Camera$Parameters")]
858pub struct Camera_Parameters;
859
860impl Camera_Parameters {
861    // 白平衡设置的值。
862    #[doc(hidden)]
863    pub const WHITE_BALANCE_AUTO: &'static str = "auto";
864    #[doc(hidden)]
865    pub const WHITE_BALANCE_INCANDESCENT: &'static str = "incandescent";
866    #[doc(hidden)]
867    pub const WHITE_BALANCE_FLUORESCENT: &'static str = "fluorescent";
868    #[doc(hidden)]
869    pub const WHITE_BALANCE_WARM_FLUORESCENT: &'static str = "warm-fluorescent";
870    #[doc(hidden)]
871    pub const WHITE_BALANCE_DAYLIGHT: &'static str = "daylight";
872    #[doc(hidden)]
873    pub const WHITE_BALANCE_CLOUDY_DAYLIGHT: &'static str = "cloudy-daylight";
874    #[doc(hidden)]
875    pub const WHITE_BALANCE_TWILIGHT: &'static str = "twilight";
876    #[doc(hidden)]
877    pub const WHITE_BALANCE_SHADE: &'static str = "shade";
878
879    // 颜色效果设置的值。
880    #[doc(hidden)]
881    pub const EFFECT_NONE: &'static str = "none";
882    #[doc(hidden)]
883    pub const EFFECT_MONO: &'static str = "mono";
884    #[doc(hidden)]
885    pub const EFFECT_NEGATIVE: &'static str = "negative";
886    #[doc(hidden)]
887    pub const EFFECT_SOLARIZE: &'static str = "solarize";
888    #[doc(hidden)]
889    pub const EFFECT_SEPIA: &'static str = "sepia";
890    #[doc(hidden)]
891    pub const EFFECT_POSTERIZE: &'static str = "posterize";
892    #[doc(hidden)]
893    pub const EFFECT_WHITEBOARD: &'static str = "whiteboard";
894    #[doc(hidden)]
895    pub const EFFECT_BLACKBOARD: &'static str = "blackboard";
896    #[doc(hidden)]
897    pub const EFFECT_AQUA: &'static str = "aqua";
898
899    //noinspection SpellCheckingInspection
900    // 抗带设置的值。
901    #[doc(hidden)]
902    pub const ANTIBANDING_AUTO: &'static str = "auto";
903    //noinspection SpellCheckingInspection
904    #[doc(hidden)]
905    pub const ANTIBANDING_50HZ: &'static str = "50hz";
906    //noinspection SpellCheckingInspection
907    #[doc(hidden)]
908    pub const ANTIBANDING_60HZ: &'static str = "60hz";
909    //noinspection SpellCheckingInspection
910    #[doc(hidden)]
911    pub const ANTIBANDING_OFF: &'static str = "off";
912
913    // 闪光模式设置的值。
914    /// 不会发射 Flash。
915    pub const FLASH_MODE_OFF: &'static str = "off";
916
917    /// 需要时闪光灯会自动闪光。根据驱动程序的不同,闪光灯可能在预览、自动对焦或快照时闪光。
918    pub const FLASH_MODE_AUTO: &'static str = "auto";
919
920    /// 拍摄快照时闪光灯始终会亮起。根据驱动程序的不同,预览或自动对焦时闪光灯也可能亮起。
921    pub const FLASH_MODE_ON: &'static str = "on";
922
923    /// 在防红眼模式下,闪光灯将会闪光。
924    pub const FLASH_MODE_RED_EYE: &'static str = "red-eye";
925
926    /// 预览、自动对焦和快照时持续发光。这也可以用于视频录制。
927    pub const FLASH_MODE_TORCH: &'static str = "torch";
928
929    /// 场景模式已关闭。
930    pub const SCENE_MODE_AUTO: &'static str = "auto";
931
932    /// 拍摄快速移动的物体。与 SCENE_MODE_SPORTS 相同。
933    pub const SCENE_MODE_ACTION: &'static str = "action";
934
935    /// 拍摄人物照片。
936    pub const SCENE_MODE_PORTRAIT: &'static str = "portrait";
937
938    /// 拍摄远处的物体。
939    pub const SCENE_MODE_LANDSCAPE: &'static str = "landscape";
940
941    /// 晚上拍照。
942    pub const SCENE_MODE_NIGHT: &'static str = "night";
943
944    /// 晚上拍摄人物照片。
945    pub const SCENE_MODE_NIGHT_PORTRAIT: &'static str = "night-portrait";
946
947    /// 在剧院拍照。闪光灯已关闭。
948    pub const SCENE_MODE_THEATRE: &'static str = "theatre";
949
950    /// 在海滩上拍照。
951    pub const SCENE_MODE_BEACH: &'static str = "beach";
952
953    /// 在雪地上拍照。
954    pub const SCENE_MODE_SNOW: &'static str = "snow";
955
956    /// 拍摄日落照片。
957    pub const SCENE_MODE_SUNSET: &'static str = "sunset";
958
959    //noinspection SpellCheckingInspection
960    /// 避免照片模糊(例如由于手抖)。
961    pub const SCENE_MODE_STEADYPHOTO: &'static str = "steadyphoto";
962
963    /// 用于拍摄烟花表演。
964    pub const SCENE_MODE_FIREWORKS: &'static str = "fireworks";
965
966    /// 拍摄快速移动的物体。与 SCENE_MODE_ACTION 相同。
967    pub const SCENE_MODE_SPORTS: &'static str = "sports";
968
969    /// 拍摄室内低光照片。
970    pub const SCENE_MODE_PARTY: &'static str = "party";
971
972    /// 捕捉烛光照亮的场景的自然温暖色彩。
973    pub const SCENE_MODE_CANDLELIGHT: &'static str = "candlelight";
974
975    /// 应用程序正在寻找条形码。摄像头驱动程序将针对条形码读取进行优化。
976    pub const SCENE_MODE_BARCODE: &'static str = "barcode";
977
978    /// 使用高动态范围成像技术捕捉场景。相机将返回与常规捕捉相比具有扩展动态范围的图像。捕捉这样的图像可能比常规捕捉花费更长的时间。
979    pub const SCENE_MODE_HDR: &'static str = "hdr";
980
981    /// 自动对焦模式。应用程序应调用 autoFocus(AutoFocusCallback) 以在此模式下启动对焦。
982    pub const FOCUS_MODE_AUTO: &'static str = "auto";
983
984    /// 焦点设置在无穷远处。在此模式下,应用程序不应调用 autoFocus(AutoFocusCallback)。
985    pub const FOCUS_MODE_INFINITY: &'static str = "infinity";
986
987    /// 微距(特写)对焦模式。应用程序应调用 autoFocus(AutoFocusCallback) 以在此模式下启动对焦。
988    pub const FOCUS_MODE_MACRO: &'static str = "macro";
989
990    /// 焦点是固定的。如果焦点不可调节,则相机始终处于此模式。如果相机具有自动对焦,则此模式可以修复焦点,该焦点通常在高焦距距离处。应用程序不应在此模式下调用AutoFocus(AutoFocusCallback)。
991    pub const FOCUS_MODE_FIXED: &'static str = "fixed";
992
993    //noinspection SpellCheckingInspection
994    /// 扩展景深 (EDOF)。聚焦以数字方式连续完成。应用程序不应在此模式下调用 autoFocus(AutoFocusCallback)。
995    pub const FOCUS_MODE_EDOF: &'static str = "edof";
996
997    /**
998    连续自动对焦模式适用于视频录制。相机会连续尝试对焦。这是视频录制的最佳选择,因为焦点变化平稳。
999    在此模式下,应用程序仍然可以调用 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback),但拍摄对象可能未对焦。设置参数后,自动对焦开始。
1000    从 API 级别 14 开始,应用程序可以在此模式下调用 autoFocus(AutoFocusCallback)。对焦回调将立即返回一个布尔值,指示对焦是否清晰。调用 autoFocus 后,对焦位置被锁定。
1001    如果应用程序想要恢复连续对焦,必须调用 cancelAutoFocus。重新启动预览不会恢复连续自动对焦。要停止连续对焦,应用程序应将对焦模式更改为其他模式。
1002    */
1003    pub const FOCUS_MODE_CONTINUOUS_VIDEO: &'static str = "continuous-video";
1004
1005    /**
1006    连续自动对焦模式,用于拍照。相机连续尝试对焦。对焦变化速度比 FOCUS_MODE_CONTINUOUS_VIDEO 更快。设置该参数后,自动对焦开始。
1007    应用程序可以在此模式下调用 autoFocus(AutoFocusCallback)。如果自动对焦正在扫描中,则对焦回调将在扫描完成后返回。如果自动对焦未扫描,则对焦回调将立即返回一个布尔值,该布尔值指示对焦是否清晰。
1008    然后,应用程序可以决定是立即拍照还是将对焦模式更改为自动,并运行完整的自动对焦周期。调用 autoFocus 后,对焦位置将被锁定。如果应用程序想要恢复连续对焦,则必须调用 cancelAutoFocus。重新启动预览不会恢复连续自动对焦。
1009    要停止连续对焦,应用程序应将对焦模式更改为其他模式。
1010    */
1011    pub const FOCUS_MODE_CONTINUOUS_PICTURE: &'static str = "continuous-picture";
1012
1013    // 焦距数组的索引。
1014    /// 与 getFocusDistances(float[]) 一起使用的近焦距数组索引。
1015    pub const FOCUS_DISTANCE_NEAR_INDEX: i32 = 0;
1016
1017    /// 与 getFocusDistances(float[]) 一起使用的最佳焦距数组索引。
1018    pub const FOCUS_DISTANCE_OPTIMAL_INDEX: i32 = 1;
1019
1020    /// 与 getFocusDistances(float[]) 一起使用的远焦距离数组索引。
1021    pub const FOCUS_DISTANCE_FAR_INDEX: i32 = 2;
1022
1023    /// 与 getPreviewFpsRange(int[]) 或 getSupportedPreviewFpsRange() 一起使用的最小预览 fps 的数组索引。
1024    pub const PREVIEW_FPS_MIN_INDEX: i32 = 0;
1025
1026    /// 用于“getPreviewFpsRange(int[])”或“getSupportedPreviewFpsRange()”的最大预览 fps 的数组索引。
1027    pub const PREVIEW_FPS_MAX_INDEX: i32 = 1;
1028
1029    /**
1030    使用其他参数的副本覆盖现有参数。仅供旧版 shim 使用。
1031    */
1032    #[java_method]
1033    pub fn copy_from(&self, other: &Self) {}
1034
1035    /**
1036    值相等性检查。
1037    */
1038    #[java_method]
1039    pub fn same(&self, other: &Self) -> bool {}
1040
1041    /**
1042    将当前参数写入日志。
1043    */
1044    #[deprecated]
1045    #[java_method]
1046    pub fn dump(&self) {}
1047
1048    /**
1049    创建一个包含此参数对象中设置的所有参数的字符串。unflatten(String) 方法执行相反的操作。
1050    返回:包含此参数对象的所有值的字符串,以分号分隔的键值对形式
1051    */
1052    #[java_method]
1053    pub fn flatten(&self) -> String {}
1054
1055    /**
1056    获取扁平化参数字符串并将每个参数添加到此参数对象。flatten() 方法执行相反的操作。
1057    `flattened` 以分号分隔的参数字符串(键值对)
1058    */
1059    #[java_method]
1060    pub fn unflatten(&self, flattened: String) {}
1061
1062    #[doc(hidden)]
1063    #[java_method]
1064    pub fn remove(&self, key: String) {}
1065
1066    /**
1067    设置字符串参数。
1068    `key` 参数的键名称
1069    `value` 参数的字符串值
1070    */
1071    #[java_method]
1072    pub fn set(&self, key: String, value: String) {}
1073
1074    /**
1075    设置一个整数参数。
1076    `key` 参数的键名称
1077    `value` 参数的 int 值
1078    */
1079    #[java_method(overload = set)]
1080    pub fn set_int(&self, key: String, value: i32) {}
1081
1082    /**
1083    返回字符串参数的值。
1084    返回:参数的字符串值
1085    `key` 参数的键名
1086    */
1087    #[java_method]
1088    pub fn get(&self, key: String) -> Result<String> {}
1089
1090    /**
1091    返回整数参数的值。
1092    返回:参数的 int 值
1093    `key` 参数的键名称
1094    */
1095    #[java_method]
1096    pub fn get_int(&self, key: String) -> Result<i32> {}
1097
1098    //noinspection SpellCheckingInspection
1099    /**
1100    设置预览图片的尺寸。如果预览已经开始,应用程序应先停止预览,然后再更改预览大小。宽度和高度的边基于相机方向。
1101    也就是说,预览大小是在按显示方向旋转之前的大小。因此,应用程序在设置预览大小时需要考虑显示方向。
1102    例如,假设相机支持 480x320 和 320x480 预览大小。应用程序需要 3:2 的预览比例。如果显示方向设置为 0 或 180,则预览大小应设置为 480x320。
1103    如果显示方向设置为 90 或 270,则预览大小应设置为 320x480。设置图片大小和缩略图大小时也应考虑显示方向。
1104    176x144 (QCIF) 分辨率的例外情况:相机设备通常具有从较大分辨率缩小到较小分辨率的固定能力,由于高分辨率图像传感器设备上的这一限制,有时不完全支持 QCIF 分辨率。
1105    因此,尝试配置 QCIF 预览大小,任何图片或视频尺寸大于 1920x1080(宽度或高度)可能不受支持,如果不支持,setParameters(Camera.Parameters) 可能会抛出 RuntimeException。
1106    `width` 图片的宽度,以像素为单位
1107    `height` 图片的高度,以像素为单位
1108    */
1109    #[java_method]
1110    pub fn set_preview_size(&self, width: i32, height: i32) -> Result<()> {}
1111
1112    /**
1113    返回预览图片的尺寸设置。
1114    返回:带有预览图片宽度和高度设置的 Size 对象
1115    */
1116    #[java_method]
1117    pub fn get_preview_size(&self) -> Camera_Size {}
1118}
1119
1120/**
1121图像尺寸(宽度和高度尺寸)。
1122*/
1123#[allow(non_camel_case_types)]
1124#[deprecated(note = "我们建议在新应用程序中使用新的 android.hardware.camera2 API。")]
1125#[java_class(name = "android/hardware/Camera$Size")]
1126pub struct Camera_Size;
1127
1128impl Camera_Size {
1129    /**
1130    设置图片的尺寸。
1131    `w` 照片宽度(像素)
1132    `h` 照片高度(像素)
1133    */
1134    #[java_constructor]
1135    pub fn new(w: i32, h: i32) -> Self {}
1136
1137    /**
1138    获取图片宽度
1139    */
1140    #[java_field]
1141    pub fn get_width(&self) -> i32 {}
1142
1143    /**
1144    设置图片宽度
1145    */
1146    #[java_field]
1147    pub fn set_width(&self, value: i32) {}
1148    /**
1149    获取图片高度
1150    */
1151    #[java_field]
1152    pub fn get_height(&self) -> i32 {}
1153
1154    /**
1155    设置图片高度
1156    */
1157    #[java_field]
1158    pub fn set_height(&self, value: i32) {}
1159}
1160
1161/**
1162Area 类用于选择相机在计算自动曝光、自动白平衡和自动对焦时使用的特定测光和对焦区域。
1163要了解给定相机支持多少个同时区域,请使用 Camera.Parameters.getMaxNumMeteringAreas() 和 Camera.Parameters.getMaxNumFocusAreas()。
1164如果不支持测光或对焦区域选择,这些方法将返回 0。每个 Area 都由一个指定其边界的矩形和一个确定其重要性的权重组成。
1165边界与相机的当前视野有关。坐标的映射方式是 (-1000, -1000) 始终是当前视野的左上角,而 (1000, 1000) 始终是当前视野的右下角。
1166不允许设置边界超出该范围的区域。不允许设置宽度或高度为零或负数的区域。权重必须在 1 到 1000 之间,表示区域中每个像素的权重。
1167这意味着具有相同权重的较大测光区域与较小区域的测光区域对测光结果的影响更大。测光区域可以重叠,驱动程序将在重叠区域添加权重。
1168*/
1169#[allow(non_camel_case_types)]
1170#[deprecated(note = "我们建议对新应用程序使用新的 android.hardware.camera2 API。")]
1171#[java_class(name = "android/hardware/Camera$Area")]
1172pub struct Camera_Area;
1173
1174impl Camera_Area {
1175    /**
1176    创建一个具有指定矩形和权重的区域。
1177    `rect` 区域的边界。
1178    `weight` 区域的权重。
1179    */
1180    #[java_constructor]
1181    pub fn new(rect: &Rect, weight: i32) -> Self {}
1182
1183    /**
1184    获取区域的边界。(-1000, -1000) 表示摄像头视野的左上角,(1000, 1000) 表示视野的右下角。不允许设置超出该范围的边界。不允许使用宽度或高度为零或负值的边界。
1185    */
1186    #[java_field]
1187    pub fn get_rect(&self) -> Rect {}
1188
1189    /**
1190    设置区域的边界。(-1000, -1000) 表示摄像头视野的左上角,(1000, 1000) 表示视野的右下角。不允许设置超出该范围的边界。不允许使用宽度或高度为零或负值的边界。
1191    */
1192    #[java_field]
1193    pub fn set_rect(&self, value: &Rect) {}
1194
1195    /**
1196    获取区域的权重。权重必须在 1 到 1000 之间,表示区域中每个像素的权重。这意味着,具有相同权重的较大测光区域与较小区域的测光区域对测光结果的影响更大。测光区域可以重叠,驱动程序将在重叠区域添加权重。
1197    */
1198    #[java_field]
1199    pub fn get_weight(&self) -> i32 {}
1200
1201    /**
1202    设置区域的权重。权重必须在 1 到 1000 之间,表示区域中每个像素的权重。这意味着,具有相同权重的较大测光区域与较小区域的测光区域对测光结果的影响更大。测光区域可以重叠,驱动程序将在重叠区域添加权重。
1203    */
1204    #[java_field]
1205    pub fn set_weight(&self, value: i32) {}
1206}
1207
1208/// 关于相机的信息
1209#[allow(non_camel_case_types)]
1210#[java_class(name = "android/hardware/Camera$CameraInfo")]
1211#[deprecated(note = "我们建议新应用程序使用新的 android.hardware.camera2 API。")]
1212pub struct Camera_CameraInfo;
1213
1214impl Camera_CameraInfo {
1215    /// 相机朝向与屏幕相反。
1216    pub const CAMERA_FACING_BACK: i32 = 0;
1217
1218    /// 相机朝向与屏幕相同。
1219    pub const CAMERA_FACING_FRONT: i32 = 1;
1220
1221    #[doc(hidden)]
1222    #[java_constructor]
1223    pub fn new() -> Self {}
1224
1225    /// 获取相机朝向。它应该是 CAMERA_FACING_BACK 或 CAMERA_FACING_FRONT。
1226    #[java_field]
1227    pub fn get_facing(&self) -> i32 {}
1228
1229    /// 设置相机朝向。它应该是 CAMERA_FACING_BACK 或 CAMERA_FACING_FRONT。
1230    #[java_field]
1231    pub fn set_facing(&self, value: i32) {}
1232
1233    /**
1234    获取相机图像的旋转角度。该值表示相机图像需要顺时针旋转多少度,才能在其自然方向上正确显示在显示设备上。它应该是 0、90、180 或 270。
1235    例如,假设一个设备的屏幕是自然竖直的。后置相机的传感器安装在横向。你正在看屏幕。如果相机传感器的顶部边缘与屏幕的自然方向上的右侧边缘对齐,则该值应为 90。如果前置相机的顶部边缘与屏幕的右侧对齐,则该值应为 270。
1236    */
1237    #[java_field]
1238    pub fn get_orientation(&self) -> i32 {}
1239
1240    /**
1241    设置相机图像的旋转角度。该值表示相机图像需要顺时针旋转多少度,才能在其自然方向上正确显示在显示设备上。它应该是 0、90、180 或 270。
1242    例如,假设一个设备的屏幕是自然竖直的。后置相机的传感器安装在横向。你正在看屏幕。如果相机传感器的顶部边缘与屏幕的自然方向上的右侧边缘对齐,则该值应为 90。如果前置相机的顶部边缘与屏幕的右侧对齐,则该值应为 270。
1243    */
1244    #[java_field]
1245    pub fn set_orientation(&self, value: i32) {}
1246
1247    /**
1248    获取是否可以禁用快门声音。
1249    在某些设备上,无法通过 enableShutterSound 禁用相机快门声音。此字段可用于确定禁用快门声音的调用是否成功。
1250    如果此字段设置为 true,则调用 `enableShutterSound(false)` 将成功。如果设置为 false,则该调用将失败,并且在调用 Camera#takePicture takePicture 时将播放快门声音。
1251    */
1252    #[java_field]
1253    pub fn get_can_disable_shutter_sound(&self) -> bool {}
1254
1255    /**
1256    设置是否可以禁用快门声音。
1257    在某些设备上,无法通过 enableShutterSound 禁用相机快门声音。此字段可用于确定禁用快门声音的调用是否成功。
1258    如果此字段设置为 true,则调用 `enableShutterSound(false)` 将成功。如果设置为 false,则该调用将失败,并且在调用 Camera#takePicture takePicture 时将播放快门声音。
1259    */
1260    #[java_field]
1261    pub fn set_can_disable_shutter_sound(&self, value: bool) {}
1262}
1263
1264/// 测试android.hardware
1265#[cfg(feature = "test_android_hardware")]
1266pub fn test() {
1267    use crate::android::app::Activity;
1268    let act = Activity::fetch().unwrap();
1269    let camera_permission = crate::android::Manifest_permission::CAMERA.to_string();
1270    let permissions = vec![camera_permission.clone()];
1271    act.request_permissions(&permissions, 100).unwrap();
1272    if act.check_self_permission(camera_permission)
1273        == crate::android::content::pm::PackageManager::PERMISSION_GRANTED
1274    {
1275        let info = Camera_CameraInfo::new();
1276        Camera::get_camera_info(Camera_CameraInfo::CAMERA_FACING_BACK, &info).unwrap();
1277        dbg!(&info);
1278        assert!(Camera::get_number_of_cameras() > 0);
1279        let camera = Camera::open(0).unwrap();
1280        camera.release();
1281        let camera = Camera::open_convenience().unwrap();
1282        camera.unlock().unwrap();
1283        camera.lock().unwrap();
1284        dbg!(&camera);
1285        camera.release();
1286    } else {
1287        println!("No camera permission.");
1288    }
1289}