Главная » Разработка для Android » Отслеживание состояния автоматической фокусировки

0

Если камера в устройстве поддерживает автоматическую фокусировку (автофокус), вы можете проследить, прошла ли данная операция успешно, используя функцию  обратного вызова AutoFocusCallback внутри объекта Camera.

В листинге 11.15 показано, как создать и назначить AutoFocusCallback для объекта Camera. При изменении состояния автофокуса обработчик со- бытия onAutoFocus получает в качестве параметров объект Camera и булево значение  success, которое сигнализирует об успешности  автоматической фокусировки.

Листинг 11.15. Отслеживание состояния автофокуса

camera.autoFocus(new AutoFocusCallback() {

public void onAutoFocus(boolean success, Camera camera) {

// TODO Использовать значение success

}

});

Использование предварительного просмотра для камеры

Доступ к видеопотоку  камеры позволяет  добавлять в приложения воз- можность предварительного просмотра.

Некоторые наиболее впечатляющие приложения для Android использу- ют эту функциональность как основу для реализации дополненной реаль- ности (наложения динамических контекстных данных, например информа- ции о достопримечательностях или различных заведениях  поверх живого видеопотока с камеры).

Как и в случае с классами MediaPlayer и MediaRecorde, предварительный просмотр  возможен  с помощью объекта SurfaceHolder. Чтобы отобразить живой видеопоток с камеры в своем приложении, нужно добавить к поль- зовательскому интерфейсу элемент  SurfaceView.  Прежде  чем передавать SurfaceHolder в метод setPreviewDisplay из объекта Camera, реализуйте абстрактный интерфейс SurfaceHolder.Callback, чтобы следить за созданием рабочей поверхности.

Вызов метода startPreview инициирует отображения потока, а stopPreview его остановит, как показано в листинге 11.16.

Листинг 11.16. Предварительный просмотр видеопотока  с камеры в режиме реального времени

public class MyActivity extends Activity implements SurfaceHolder. Callback {

private Camera camera;

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

SurfaceView surface = (SurfaceView)findViewById(R.id.surface); SurfaceHolder holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300);

}

public void surfaceCreated(SurfaceHolder holder) {

if (mediaRecorder == null) {

try {

camera = camera.open(); camera.setPreviewDisplay(holder); camera.startPreview();

[ . . . Вывод изображения на поверхности . . . ]

} catch (IOException e) { Log.d("CAMERA", e.getMessage());

}

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

camera.stopPreview();

camera.release();

}

}

В главе 15 вы узнаете больше о поверхностях для отображения видео- данных. Обратите  внимание  на пример, входящий  в состав Android  SDK, в котором описывается использование объекта SurfaceView для отображе- ния предварительного просмотра видеопотока с камеры в режиме реального времени.

Вы также можете назначить PreviewCallback для срабатывания на каж- дом новом кадре — это позволит манипулировать с картинкой или отобра- жать каждый кадр отдельно.

Вызовите  метод setPreviewCallback из объекта  Camera,  передав  ему в качестве параметра новую реализацию PreviewCallback и переопределив обработчик onPreviewFrame, как показано в листинге 11.17.

Листинг 11.17. Назначение функции обратного вызова для предварительного просмотра

camera.setPreviewCallback(new PreviewCallback() {

public void onPreviewFrame(byte[] _data, Camera _camera) {

// TODO Какие-то действия с изображением из предварительного

// просмотра.

}

});

Обработчик onPreviewFrame получит  каждый  кадр в виде массива байтов.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии