Камера setFocusAreas() не работает Android 4.0
Я создаю приложение для камеры, которое будет использовать функцию крана для фокусировки, как и многие стандартные приложения для камеры. Сначала я получаю координату (x, y) события касания, а затем передаю это значение в пользовательский интерфейс. Затем я пытаюсь установить область фокусировки, например:
Rect newRect = new Rect(left,top,right, bottom);
Camera.Parameters params = mCamera.mCameraInstance.getParameters();
Camera.Area focusArea = new Camera.Area(newRect, 1000);
List<Camera.Area> focusAreas = new ArrayList<Camera.Area>();
focusAreas.add(focusArea);
params.setFocusAreas(focusAreas);
Однако, похоже, это не имеет никакого эффекта. Итак, я закодировал некоторые значения в прямоугольнике (таким образом, я могу исключить плохие координаты из события касания). В соответствии с документами, он ищет координату в пространстве (-1000, -1000) (вверху слева) до (1000, 1000 )(внизу справа).
Итак, я заменил свой прямоугольник выше на этот:
//should target a 100x100 square in the center of the screen
Rect newRect = new Rect(-50,-50,50, 50);
И все же, кажется, не имеет никакого эффекта. Я знаю, что моя камера поддерживает настройку областей фокусировки, потому что в первую очередь приложение камеры использует его успешно, а также params.getMaxNumFocusAreas() возвращает 1.
Если кто-то использовал это с успехом в прошлом, пожалуйста, дайте мне знать!
Изменить:
Я нашел этот похожий вопрос, который также указывает, что этот API просто не работает на устройствах Android 4.0 и выше (im testing на 4.1.1, Galaxy S3). И тем не менее, приложения для камер на этих устройствах по-прежнему имеют функциональность "коснуться". Что мне не хватает???
Ответы
Ответ 1
У меня была эта проблема сегодня:/
И после нескольких часов борьбы я нашел решение!
Странно, но кажется, что настройка фокус-режима на "макро" прямо перед настройкой областей фокусировки решила проблему;)
params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
params.setFocusAreas(focusAreas);
mCamera.setParameters(params);
У меня Galaxy S3 с Android 4.1.2
Я надеюсь, что это сработает для вас:)
Ответ 2
Это не работает для меня ни один, но в любом случае, при настройке rect, убедитесь, что
left < right
и top < bottom
!
Вы устанавливаете свой прямоугольник на высоту -100!
И, кстати, вы не устанавливаете квадрат 50x50, а 100x-100.
Ответ 3
После просмотра источника источника 4.3 и просмотра API-интерфейса камеры в течение нескольких часов я обнаружил эту функцию:
public final void autoFocus (Camera.AutoFocusCallback cb)
Итак, вы должны иметь возможность добавить несколько строк в свой код:
Rect newRect = new Rect(left,top,right, bottom);
Camera.Parameters params = mCamera.mCameraInstance.getParameters();
Camera.Area focusArea = new Camera.Area(newRect, 1000);
List<Camera.Area> focusAreas = new ArrayList<Camera.Area>();
focusAreas.add(focusArea);
params.setFocusAreas(focusAreas);
/**
* ISO changes occurs passively after setting it in the cameraParams. Auto focus
* parameters that have been set don't take affect until calling Camera.autoFocus()
*/
mCamera.autoFocus(new Camera.AutoFocusCallback()
{
@Override
public void onAutoFocus(boolean success, Camera camera)
{
Log.d(TAG, "onAutoFocus() " + success);
}
});