Я работаю с модулем CAMERA для своего приложения несколько дней. Я настроил полный модуль камеры вместо того, чтобы вызывать аппаратную встроенную мобильную камеру через намерение. Я использовал обратные вызовы для затвора, изображения и т. Д. Теперь я пытаюсь добавить функции ZOOM и AUTO-FOCUS к этой настроенной камере. Кто-нибудь, пожалуйста, дайте мне знать, как добавить функции ZOOM и AUTO-FOCUS вместе с необходимыми разрешениями, которые должны быть упомянуты в файле манифеста. Надеюсь, мне помогут как можно скорее.
Функция автофокуса для модуля камеры моего приложения для Android
Ответы (2)
Пара наблюдений с моей стороны.
1) Camera.autoFocus
— это одноразовый вызов, применимый, когда Camera.getParameters.getFocusMode()
является либо FOCUS-MODE-AUTO
, либо FOCUS-MODE-MACRO
, в других случаях вам не нужно вызывать метод autoFocus
. См. документацию по API и преданно следуйте ей.
2) Однократный вызов означает, что этот метод не регистрирует экземпляр AutoFocusCallback
для непрерывного получения уведомлений.
3) Скорее, FOCUS-MODE-AUTO
даже не динамическая и непрерывная константа фокуса. Вместо этого вы можете использовать FOCUS-MODE-EDOF
или FOCUS-MODE-CONTINUOUS-PICTURES
в зависимости от уровня API и версии SDK, которую вы используете и для которой создаете.
4) Существует большая вероятность того, что фактическая камера устройства может не поддерживать некоторые константы FOCUS-MODE
, такие как EDOF
или INFINITE
. Всегда убедитесь, что при создании параметров камеры вы проверяете getSupportedFocusModes
и используете применимые константы.
5) Вызов camera.autoFocus
непосредственно перед camera.takePicture
может увеличить результирующий массив байтов jpeg в PictureCallBack
как минимум на 50% больше, чем его исходный размер. Отсутствие явного вызова autoFocus()
может иногда приводить к тому, что предыдущее autoFocus()
заканчивается с очень низким разрешением, что может привести к тому, что длина jpeg-байтового массива составит всего 10 КБ, что приведет к нулевому растровому изображению из BitmapFactory
.
6) О разрешениях автофокуса см. документацию по API.
7) Что касается масштабирования, то это не так сложно, как реализовать функцию автофокуса. В зависимости от взаимодействия с экраном, такого как слайдер, или аппаратных клавиш, таких как клавиши регулировки громкости, вы можете реализовать ZoomChangeListener
, который вы можете зарегистрировать с помощью Camera
, как только экземпляр Camera
будет получен от open(int cameraId)
.
Для увеличения (2x):
Camera.Parameters parameters = camera.getParameters();
parameters.set("zoom", "2.0");
parameters.set("taking-picture-zoom", "20");
Для уровня API> 5 используйте API, например setZoom( ) и т. д.
Для автофокусировки (взято с zxing)
public final boolean onKeyDown(int keyCode, KeyEvent event) {
synchronized(this) {
if (!bIsPictureTaking) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_CAMERA) {
if (!bIsPictureTaking && !bIsAutoFocusStarted){
YourAutoFocusCallback autoFocusCallBack = new YourAutoFocusCallback();
camera.autoFocus(autoFocusCallBack);
.
final class YourAutoFocusCallback implements Camera.AutoFocusCallback {
private static final long AUTOFOCUS_INTERVAL_MS = 1500L;
private final CameraConfigurationManager configManager;
private boolean reinitCamera;
private Handler autoFocusHandler;
private int autoFocusMessage;
AutoFocusCallback(CameraConfigurationManager configManager) {
this.configManager = configManager;
}
void setHandler(Handler autoFocusHandler, int autoFocusMessage) {
this.autoFocusHandler = autoFocusHandler;
this.autoFocusMessage = autoFocusMessage;
}
public void onAutoFocus(boolean success, Camera camera) {
if (autoFocusHandler != null) {
Message message = autoFocusHandler.obtainMessage(autoFocusMessage, success);
autoFocusHandler.sendMessageDelayed(message, AUTOFOCUS_INTERVAL_MS);
autoFocusHandler = null;
configManager.setDesiredCameraParameters(camera);
} else {
}
}
}
ameraConfigurationManager
, если я setParameters
SurfaceChanged и как создать/передать обработчик с помощью setHandler. Мой код фокуса здесь. Мне нужно нажать и удерживать кнопку спуска затвора в течение нескольких секунд, чтобы камера сфокусировалась, и только тогда я могу сделать снимок. Размещение кода PictureCallback в Thread/AsyncTask не помогло. Я позаимствовал код для кнопки ShutterButton здесь.
- person vamsiampolu; 03.01.2014