Android — Android — работа с камерой


Содержание

Android — Android — работа с камерой

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

Работа с камерой на телефоне всегда представляла для меня интерес. Как же это все устроено… И вот мне в руки попал телефон с Android’ом. Я не преминул возможностью попробовать разобраться в этом. Вот что получилось в итоге.

Рассмотрим небольшую программу, которая позволяет делать снимки.

Все операции проводятся с помощью класса Camera.

Необходимо завести переменную

и инициализировать ее

После завершения работы с камерой необходимо сделать

в противном случае камера останется заблокированной и недоступной для других приложений.

Для обычных приложений типа фотокамеры инициализацию лучше всего производить в onResume, а освобождение в onPause.

Обязательным условием при работе с камерой является создание окна предпросмотра (preview). Это окно должно являться объектом класса Surfaceи для отображения на экране подходит SurfaceView.

Чтобы задать preview, необходимо вызвать метод setPreviewDisplay, параметром которого является объект класса SurfaceHolder.

SurfaceHolder surfaceHolder;
surfaceHolder = preview.getHolder();
camera.setPreviewDisplay(surfaceHolder);

Чтобы включить отображение preview, вызываем

Если этого не сделать, то камера не сможет делать снимки.

Собственно для того, чтобы сделать снимок, необходимо вызвать метод

void takePicture(Camera.ShutterCalback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpg);

С помощью параметров (кстати, любой из них может быть null) задаются обработчики разных событий:

  • shutter — вызывается в момент получения изображения с матрицы
  • raw — программе передаются для обработки raw данные (если поддерживается аппаратно)
  • postview — программе передаются полностью обработанные данные (если поддерживается аппаратно)
  • jpg — программе передается изображение в виде jpg. Здесь можно организовать запись изображения на карту памяти.

Вызов takePicture можно поместить непосредственно в обработчик onClick кнопки — в этом случае фотографирование произойдет сразу после нажатия на нее, но можно и воспользоваться предварительной автофокусировкой.

В этом случае задается обработчик Camera.AutoFocusCallback, в котором необходимо реализовать метод

public void onAutoFocus(boolean paramBoolean, Camera paramCamera);

Тогда после вызова в обработчике нажатия на кнопку camera.autoFocus(), однократно будет вызван обработчик, в котором мы уже и примем решение об удачной фокусировке и необходимости сделать снимок.

Для работы с SurfaceHolder можно задать SurfaceHolder.Callback

В этом случае необходимо реализовать методы

public void surfaceCreated(SurfaceHolder holder);
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height);
public void surfaceDestroyed(SurfaceHolder holder);

C помощью них приложению будет сообщаться о том, что Surface успешно создано, если оно изменено или то, что оно удалено.

Размер нашего preview можно менять в процессе выполнения программы:

LayoutParams lp = preview.getLayoutParams();
lp.w >lp.height = задаваемая высота;
preview.setLayoutParams(lp);

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

В противном случае нам придется, например, в surfaceCreated проверять расположение экрана и поворачивать preview с помощью, например, camera.setDisplayOrientation(0).

Это не очень удобно, потому что поворот экрана занимает какое-то время. В этот момент происходит вызов onPause и onResume, пересоздается Surface.

Также имеется возможность объявить обработчик Camera.PreviewCallback, с помощью которого путем реализации метода

void onPreviewFrame(byte[] paramArrayOfByte, Camera paramCamera);

можно получать и обрабатывать каждый кадр, отображаемый в preview.

И последний важный момент. Чаще всего получается так, что отношение сторон SurfaceView отличается от отношения сторон в preview камеры. Поэтому для того, чтобы избежать искажений изображения на экране, необходимо подкорректировать размер отображаемого окна предпросмотра.

Чуть не забыл. В манифест необходимо добавить permission

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.view.View;

import android.hardware.Camera;
import android.hardware.Camera.Size;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainScreen extends Activity implements SurfaceHolder.Callback, View.OnClickListener, Camera.PictureCallback, Camera.PreviewCallback, Camera.AutoFocusCallback
<
private Camera camera;
private SurfaceHolder surfaceHolder;
private SurfaceView preview;
private Button shotBtn;

@Override
public void onCreate(Bundle savedInstanceState)
<
super.onCreate(savedInstanceState);

// если хотим, чтобы приложение постоянно имело портретную ориентацию
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

// если хотим, чтобы приложение было полноэкранным
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

// и без заголовка
requestWindowFeature(Window.FEATURE_NO_TITLE);

// наше SurfaceView имеет имя SurfaceView01
preview = (SurfaceView) findViewById(R.id.SurfaceView01);

surfaceHolder = preview.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

// кнопка имеет имя Button01
shotBtn = (Button) findViewById(R.id.Button01);
shotBtn.setText(«Shot»);
shotBtn.setOnClickListener(this);
>

@Override
protected void onResume()
<
super.onResume();
camera = Camera.open();
>

@Override
protected void onPause()
<
super.onPause();

if (camera != null)
<
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera = null;
>
>

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
<
>

@Override
public void surfaceCreated(SurfaceHolder holder)
<
try
<
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
>
catch (IOException e)
<
e.printStackTrace();
>

Size previewSize = camera.getParameters().getPreviewSize();
float aspect = (float) previewSize.width / previewSize.height;

int previewSurfaceW > int previewSurfaceHeight = preview.getHeight();

LayoutParams lp = preview.getLayoutParams();

// здесь корректируем размер отображаемого preview, чтобы не было искажений

if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
<
// портретный вид
camera.setDisplayOrientation(90);
lp.height = previewSurfaceHeight;
lp.w > ;
>
else
<
// ландшафтный
camera.setDisplayOrientation(0);
lp.w > lp.height = (int) (previewSurfaceWidth / aspect);
>

@Override
public void surfaceDestroyed(SurfaceHolder holder)
<
>

@Override
public void onClick(View v)
<
if (v == shotBtn)
<
// либо делаем снимок непосредственно здесь
// либо включаем обработчик автофокуса

//camera.takePicture(null, null, null, this);
camera.autoFocus(this);
>
>

@Override
public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera)
<
// сохраняем полученные jpg в папке /sdcard/CameraExample/
// имя файла — System.currentTimeMillis()

try
<
File saveDir = new File(«/sdcard/CameraExample/»);

if (!saveDir.exists())
<
saveDir.mkdirs();
>

FileOutputStream os = new FileOutputStream(String.format(«/sdcard/CameraExample/%d.jpg», System.currentTimeMillis()));
os.write(paramArrayOfByte);
os.close();
>
catch (Exception e)
<
>

// после того, как снимок сделан, показ превью отключается. необходимо включить его
paramCamera.startPreview();
>

@Override
public void onAutoFocus(boolean paramBoolean, Camera paramCamera)
<
if (paramBoolean)
<
// если удалось сфокусироваться, делаем снимок
paramCamera.takePicture(null, null, null, this);
>
>

@Override
public void onPreviewFrame(byte[] paramArrayOfByte, Camera paramCamera)
<
// здесь можно обрабатывать изображение, показываемое в preview
>
>

Программа отлаживалась и тестировалась на телефоне LG Optimus One P500.

При написании использовались следующие источники информации:

Android — Android — работа с камерой

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

Существует масса приложений в которых происходит работа с камерой устройства и в этом уроке мы тоже научимся использовать камеру устройства в своих приложениях.

Создаем новый проект, берем Blank Activity. Сразу давайте импортируем в проект нужные строки:

Они позволят нам делать захват изображения, его сохранение и высвечивать на экран пользователя.

Теперь давайте добавим строковые ресурсы, которые будут использоваться в приложении. Открываем файл strings.xml и добавляем туда строки:

Перейдем к работе над интерфейсом программы. Открываем файл activity_main.xml. Нам нужно создать 3 элемента: TextView, кнопку для запуска камеры Button и элемент для отображения фото ImageView:

Для ImageView установлен фон @drawable/border и эта строка сейчас подсвечивается красным, потому, что такого файла border у нас пока нету. Его нужно создать. Этот файл будет задавать вид для ImageView. Для того, чтобы он корректно отображался во всех возможных случаях, этот файл нужно создать для каждой папки drawable (то есть, drawable, drawable-hdpi, drawable-mdpi, drawable-xhdpi, drawable-xxhdpi). Сделаем так, создаем файл border.xml в папке drawable. Он будет содержать следующее:


Получился вот такой вот вид:

Берем этот код, копируем в блокнот, создаем в каждой из drawable папок, указанных выше, файл border.xml и кидаем в них этот же код (ищем эти папки вручную в файлах приложения и вручную создаем файлики).

На данный момент интерфейс нашей программы выглядит так:

Добавим нашей кнопке в activitymain.xml нажатие:

И добавим метод описания этого нажатия. Ставим курсор на «Photo», жмем Atl+Enter и выбираем верхнюю строку:

Переходим к работе в файле MainActivity.java. В методе onCreate заявляем о существовании нашей кнопки:

Теперь переходим к самому интересному — настроим запуск камеры по нажатию на кнопку»Запустить камеру». До метода onCreate задаем использование следующих переменных:

В методе Photo (обработки нажатия) добавляем намерение использовать камеру и работать с полученными с нее данными:

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

Следующим шагом нужно научить программу извлекать полученное камерой изображение. Ниже метода «Photo» добавляем метод onActivityResult (ставим курсор на пространство ниже метода «Photo», жмем на панели программы Code — Override Methods, начинаем вводить имя метода, подсказки вам его укажут). Добавляем в него следующее:

Сейчас строка cropImage(); подсвечена красным, ставим на нее курсор и Android Studio предлагаем нам создать метод cropImage, соглашаемся:

Переходим к работе в этом методе. Добавляем сюда намерение работы с изображением, учтем, как и выше, случаи когда устройство не поддерживает таких функций:

Дальше добавляем код, который будет указывать приложению извлекать изображение после его захвата (извлечение данных с камеры в приложение) , задавать захваченному камерой изображению различные характеристики:

Ну и под конец, нужно настроить отображение полученного с камеры изображения. В методе ‘onActivityResult’ после оператора if добавим оператор else, в котором опишем действия для программы по возвращению от действий захвата изображения:

И добавляем в этот оператор следующий код:

Чтобы вы не потеряли ничего с необходимого кода, вот весь код файла MainActivity.java:

Все готово! Приступаем к тестированию приложения. Как вы поняли, тест на эмуляторе ничего не даст, нужно устройство с реальной камерой.

Android — Android — работа с камерой

Скачай Fake Camera

Добавлено 23.01.2020, 15:26:

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

Сообщение отредактировал yayo13 — 05.03.19, 17:22

Как получить полную фотографию с камеры в andro >

Добрый вечер. Целый день борюсь с захватом фотографии с камеры. Кроме как получить миниатюрную копию фотографии ничего не выходит.
Делаю по вот это инструкции:
developer.alexanderklimov.ru/android/photocamera.php

Файл с изображением с камеры камеры успешно создается таким образом:

Пытаюсь вытащить битмап из файла в переменную thumbnailBitmap, но ничего не выходит. То ошибка доступа, то вообще нет ошибки но thumbnailBitmap остается null. Как получить битмап? Файл создается в корневой директории успешно.

Если заменить содержимое decodeFile на mCurrentPhotoPath , или Uri.fromFile(imgCamFile).toString() все равно не помогает.

Надеюсь на вашу помощь, заранее спасибо.

  • Вопрос задан более трёх лет назад
  • 1121 просмотр

Чтобы получить изображение в полном размере , вам нужно вначале
заставить камеру сохранить картинку во временном файле:

Затем, после записи изображения — просто вытащите изображение из imageUri :

1) Убедитесь, что permissions в правильном месте:

2)У вас случайно не Marshmallow(23 API)?
Если это так, то permissions также должны проверяться в коде:

Фотосъемка

В уроке рассказывается как делать фотографии, используя существующие приложения.

Допустим вы разрабатываете приложение для службы погоды, которая строит глобальную карту погоды путем смешивания фотографий неба, сделанных с помощью встроенной камеры. Сама фотосъемка это лишь малая часть вашего приложения. Вы можете делать фотографии с минимальными усилиями, не изобретая велосипед. К счастью, большинство Android устройств включают в себя по крайней мере одно приложение для работы с камерой. В уроке мы покажем как их можно использовать для получения фото.


Получаем разрешение на камеру

Если получение снимков – важная часть вашего приложения, то показывайте его на Google Play только для устройств, которые имеют камеру. Для этого добавьте элемент в файл манифеста:

Если для большинства функций приложения камера не нужна, установите атрибут android:required в значение false . Тогда Google Play позволит устройствам без камеры загружать ваше приложение. В таком случае вы должны программно проверять наличие камеры с помощью метода hasSystemFeature(PackageManager.FEATURE_CAMERA). Если камера недоступна, отключите все функции, которые ее используют.

Цукерберг рекомендует:  Формируется - Отсутствие доступа к материалам и обучению

Получаем фото с помощью других приложений

Чтобы использовать другие приложение для каких-либо действий, в Android применяются намерения – объекты типа Intent, в которых описывается, что конкретно вы хотите сделать. Этот процесс включает три составляющих: само намерение – объект типа Intent, вызов внешнего явления – объекта типа Activity и некоторый код, который обрабатывает данные, полученные от внешнего явления.

Пример выполнения намерения для получения фотографии с камеры:

Не забывайте, что для безопасного использования метода startActivityForResult() необходимо убедиться, что существует явление, способное обработать запрос. Это можно сделать с помощью метода resolveActivity(), который возвращает первое явление, способное обработать намерение. Если не провести такую проверку и явление для обработки не существует, при вызове startActivityForResult() приложение аварийно завершится.

Получение миниатюр

Наверняка сам факт срабатывания затвора камеры это не предел желаний, и после съемки вы захотите получить картинку с камеры в ваше приложение, чтобы что-то с ней сделать.

Стандартное приложение “Камера” сжимает фото, которое возвращает намерение, в маленький объект типа Bitmap и передает в дополнительных данных с ключом «data» . В следующем примере показано, как получить изображение и отобразить его в компоненте ImageView:

Примечание: миниатюра картинки из «data» хороша для иконки или аватара, но вряд ли хороша для чего-то большего. Получение полноразмерного изображения требует немного больше работы.

Сохранение полноразмерной фотографии

Приложение Камера сохраняет полноразмерное изображение, если передать ему имя файла для сохранения. Вы должны передать имя со всеми спецификаторами, чтобы приложение могло сохранить фотографию.

В целом, все сделанные с помощью камеры фотографии должны располагаться в публичной директории внешнего хранилища, чтобы любое приложение могло получить к ним доступ. Для получения общей директории для хранения фотографий служит метод getExternalStoragePublicDirectory(), в который нужно передать аргумент DIRECTORY_PICTURES. Поскольку метод возвращает каталог, доступный для всех приложений, необходимо получить разрешения READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE. Права на запись разрешают также чтение, поэтому если вы хотите записывать в публичный каталог и читать из него, добавьте только разрешение на запись:

Но если вы хотите получить фотографии, доступные только для вашего приложения, используйте директорию, которую возвращает метод getExternalFilesDir(). В Android 4.3 и ниже, запись в эту директорию также требует разрешения WRITE_EXTERNAL_STORAGE . Начиная с Android 4.4, права на запись не требуются, поскольку директория недоступна из других приложений. Добавляйте разрешение на запись в том случае, если поддерживаете приложения с ранними версиями, включив атрибут maxSdkVersion:

Примечание: файлы, сохраненные в директории, которую возвращает метод getExternalFilesDir(), удаляются вместе с приложением.

После выбора директории для файлов, необходимо выбрать устойчивое к коллизиям имя файла. Вы можете также сохранить директорию в переменной, чтобы использовать ее позже. Пример кода, который возвращает уникальное имя файла для новой фотографии, используя текущие дату и время:

Как получить снимок с камеры в Andro > Программирование для Android подразумевает решение очень широкого круга задач, и хотя использование камеры — не самая распространенная из них, тем не менее на тематических форумах довольно часто встречаются вопросы, связанные с этой темой. Давайте для примера разработаем простую программу, демонстрирующую использование встроенного в android приложения для работы с камерой для получения снимка. Логика работы нашего приложения будет довольно проста: при нажатии на кнопку у нас будет запускаться стандартная программа для работы с камерой. После того, как мы сделаем снимок и закроем это приложение, результат будет отображаться в ImageView. Ниже приводится код файла манифеста и макета заготовки нашего приложения

Запускаем приложение для работы с Andro >
В android новые деятельности и службы запускаются с помощью, так называемых интентов (intent). Для запуска стандартного приложения для работы с камерой нужно использовать следующий интент:

Давайте создадим его внутри метода button_click :

Если Вы просто выполните этот код в своей Activity, запустится камера. Сделанный снимок можно получить из данных, которые возвращает интент.

Обычно интенты запускаются с помощью метода startActivity(), однако в случае, когда приложение ждет от интента какого-то результата, необходимо использовать метод startActivityForResult(). Для того, чтобы получить от стандартного приложения камеры снимок, мы должны запустить интент следующим образом:

После того как пользователь сделал снимок и завершил Activity камеры, картинка будет доступна через метод onActivityResult(). Вам нужно переопределить этот callback метод внутри своего приложения:

И снова, CAMERA_PIC_REQUEST — это константа, которую нужно определить в своем приложении и ее значение будет ассоциироваться с результатом, возвращаемым интентом:

Вы можете использовать это значение для того чтобы различать различные виды результатов, которые могут возвращаться в результате работы интента.

Получаемое в результате изображение адаптировано для показа на маленьком экране телефона и представлено в виде объекта Bitmap

Для того чтобы показать это изображение в ImageView нужно воспользоваться методом setImageBitmap().

В результате всех наших манипуляций наш java проект будет иметь вид:

И не забудьте про разрешения. Чтобы приложение заработало нужно добавить в uses-permission значение android.permission.CAMERA.

Как видите, добавить поддержку камеры в свое приложение очень просто, однако не все пользователи имеют телефоны с камерой. К счастью есть простой способ решения этой проблемы. Нужно просто запретить устанавливать это приложение таким пользователям. Для этого нужно использовать тег в манефесте Вашего приложения:

После добавления этой строки Ваше приложение не будет показываться пользователям без камеры в Google Play Market. Тем не менее, вовсе не запрещает прямую установку приложения на неподходящий телефон — это просто фильтр для Google Play Market.

Работа с камерой Andro >

Я новичок в Android, и я начал работать над приложением для потоковой передачи видео (от устройства к ПК). Согласно тому, что я видел до сих пор, что лучше: 1. Использование обратных вызовов камеры + кодирование для jpeg 2. Использование MediaRecorder (например, H264 или что-то еще). Я видел, что с этим API существует много проблем.

Я работал над видеопотоком, и мы пробовали оба подхода — обратите внимание, что это было 2-3 года назад.

Вариант 1., вероятно, слишком медленный для достижения хороших ставок, нам удалось около 8-12 кадров в секунду. Обратите внимание, что это было два года назад, а телефоны были значительно медленнее.

Вариант 2. Мы выбираем этот подход для Androd, это выполнимо, но есть проблемы с некоторыми телефонами.

Camera API

The Android framework includes support for various cameras and camera features available on devices, allowing you to capture pictures and videos in your applications. This document discusses a quick, simple approach to image and video capture and outlines an advanced approach for creating custom camera experiences for your users.

Note: This page describes the Camera >camera2 , which works on Android 5.0 (API level 21) or greater. Read more about camera2 on our blog and watch this video.


Refer to the following related resources:

Considerations

Before enabling your application to use cameras on Android devices, you should consider a few questions about how your app intends to use this hardware feature.

  • Camera Requirement — Is the use of a camera so important to your application that you do not want your application installed on a device that does not have a camera? If so, you should declare the camera requirement in your manifest.
  • Quick Picture or Customized Camera — How will your application use the camera? Are you just interested in snapping a quick picture or video clip, or will your application provide a new way to use cameras? For a getting a quick snap or clip, consider Using Existing Camera Apps. For developing a customized camera feature, check out the Building a Camera App section.
  • Foreground Services Requirement — When does your app interact with the camera? On Android 9 (API level 28) and later, apps running in the background cannot access the camera. Therefore, you should use the camera either when your app is in the foreground or as part of a foreground service.
  • Storage — Are the images or videos your application generates intended to be only visible to your application or shared so that other applications such as Gallery or other media and social apps can use them? Do you want the pictures and videos to be available even if your application is uninstalled? Check out the Saving Media Files section to see how to implement these options.

The basics

The Andro >android.hardware.camera2 API or camera Intent . Here are the relevant classes:

android.hardware.camera2 This package is the primary API for controlling device cameras. It can be used to take pictures or videos when you are building a camera application. Camera This class is the older deprecated API for controlling device cameras. SurfaceView This class is used to present a live camera preview to the user. MediaRecorder This class is used to record video from the camera. Intent An intent action type of MediaStore.ACTION_IMAGE_CAPTURE or MediaStore.ACTION_VIDEO_CAPTURE can be used to capture images or v >Camera object.

Manifest declarations

Before starting development on your application with the Camera API, you should make sure your manifest has the appropriate declarations to allow use of camera hardware and other related features.

    Camera Permission — Your application must request permission to use a device camera.

Note: If you are using the camera by invoking an existing camera app, your application does not need to request this permission.

Camera Features — Your application must also declare use of camera features, for example:

For a list of camera features, see the manifest Features Reference.

Adding camera features to your manifest causes Google Play to prevent your application from being installed to devices that do not include a camera or do not support the camera features you specify. For more information about using feature-based filtering with Google Play, see Google Play and Feature-Based Filtering.

If your application can use a camera or camera feature for proper operation, but does not require it, you should specify this in the manifest by including the android:required attribute, and setting it to false :

Location Permission — If your application tags images with GPS location information, you must request the ACCESS_FINE_LOCATION permission. Note that, if your app targets Android 5.0 (API level 21) or higher, you also need to declare that your app uses the device’s GPS:

For more information about getting user location, see Location Strategies.

Using existing camera apps

A quick way to enable taking pictures or v >Intent to invoke an existing Android camera application. The details are described in the training lessons Taking Photos Simply and Recording Videos Simply.

Building a camera app

Some developers may require a camera user interface that is customized to the look of their application or provides special features. Writing your own picture-taking code can provide a more compelling experience for your users.

Note: The following gu >Camera API. For new or advanced camera applications, the newer android.hardware.camera2 API is recommended.

The general steps for creating a custom camera interface for your application are as follows:

  • Detect and Access Camera — Create code to check for the existence of cameras and request access.
  • Create a Preview >SurfaceView and implements the SurfaceHolder interface. This class previews the live images from the camera.
  • Build a Preview Layout — Once you have the camera preview class, create a view layout that incorporates the preview and the user interface controls you want.
  • Setup Listeners for Capture — Connect listeners for your interface controls to start image or video capture in response to user actions, such as pressing a button.
  • Capture and Save Files — Setup the code for capturing pictures or videos and saving the output.
  • Release the Camera — After using the camera, your application must properly release it for use by other applications.

Camera hardware is a shared resource that must be carefully managed so your application does not collide with other applications that may also want to use it. The following sections discusses how to detect camera hardware, how to request access to a camera, how to capture pictures or video and how to release the camera when your application is done using it.

Caution: Remember to release the Camera object by calling the Camera.release() when your application is done using it! If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

Detecting camera hardware

If your application does not specifically require a camera using a manifest declaration, you should check to see if a camera is available at runtime. To perform this check, use the PackageManager.hasSystemFeature() method, as shown in the example code below:

Kotlin

Accessing cameras

If you have determined that the device on which your application is running has a camera, you must request to access it by getting an instance of Camera (unless you are using an intent to access the camera).

To access the primary camera, use the Camera.open() method and be sure to catch any exceptions, as shown in the code below:

Kotlin

Caution: Always check for exceptions when using Camera.open() . Failing to check for exceptions if the camera is in use or does not exist will cause your application to be shut down by the system.

On devices running Andro >Camera.open(int) . The example code above will access the first, back-facing camera on a device with more than one camera.

Checking camera features


Once you obtain access to a camera, you can get further information about its capabilities using the Camera.getParameters() method and checking the returned Camera.Parameters object for supported capabilities. When using API Level 9 or higher, use the Camera.getCameraInfo() to determine if a camera is on the front or back of the device, and the orientation of the image.

Creating a preview class

For users to effectively take pictures or v >SurfaceView that can display the live image data coming from a camera, so users can frame and capture a picture or video.

The following example code demonstrates how to create a basic camera preview >View layout. This >SurfaceHolder.Callback in order to capture the callback events for creating and destroying the view, which are needed for assigning the camera preview input.

Kotlin

If you want to set a specific size for your camera preview, set this in the surfaceChanged() method as noted in the comments above. When setting preview size, you must use values from getSupportedPreviewSizes() . Do not set arbitrary values in the setPreviewSize() method.

Note: With the introduction of the Multi-Window feature in Andro >setDisplayOrientation() . Depending on the window size and aspect ratio, you may may have to fit a wide camera preview into a portrait-orientated layout, or vice versa, using a letterbox layout.

Placing preview in a layout

A camera preview class, such as the example shown in the previous section, must be placed in the layout of an activity along with other user interface controls for taking a picture or video. This section shows you how to build a basic layout and activity for the preview.

The following layout code prov >FrameLayout element is meant to be the container for the camera preview class. This layout type is used so that additional picture information or controls can be overlaid on the live camera preview images.

On most devices, the default orientation of the camera preview is landscape. This example layout specifies a horizontal (landscape) layout and the code below fixes the orientation of the application to landscape. For simplicity in rendering a camera preview, you should change your application’s preview activity orientation to landscape by adding the following to your manifest.

Note: A camera preview does not have to be in landscape mode. Starting in Andro >setDisplayOrientation() method to set the rotation of the preview image. In order to change preview orientation as the user re-orients the phone, within the surfaceChanged() method of your preview >Camera.stopPreview() change the orientation and then start the preview again with Camera.startPreview() .

In the activity for your camera view, add your preview >FrameLayout element shown in the example above. Your camera activity must also ensure that it releases the camera when it is paused or shut down. The following example shows how to modify a camera activity to attach the preview class shown in Creating a preview class.

Kotlin

Note: The getCameraInstance() method in the example above refers to the example method shown in Accessing cameras.

Capturing pictures

Once you have built a preview class and a view layout in which to display it, you are ready to start capturing images with your application. In your application code, you must set up listeners for your user interface controls to respond to a user action by taking a picture.

In order to retrieve a picture, use the Camera.takePicture() method. This method takes three parameters which receive data from the camera. In order to receive data in a JPEG format, you must implement an Camera.PictureCallback interface to receive the image data and write it to a file. The following code shows a basic implementation of the Camera.PictureCallback interface to save an image received from the camera.

Kotlin

Trigger capturing an image by calling the Camera.takePicture() method. The following example code shows how to call this method from a button View.OnClickListener .

Kotlin

Note: The mPicture member in the following example refers to the example code above.

Caution: Remember to release the Camera object by calling the Camera.release() when your application is done using it! For information about how to release the camera, see Releasing the camera.

Capturing videos

V >Camera object and coordination with the MediaRecorder >Camera , you must manage the Camera.lock() and Camera.unlock() calls to allow MediaRecorder access to the camera hardware, in addition to the Camera.open() and Camera.release() calls.

Note: Starting with Andro >Camera.lock() and Camera.unlock() calls are managed for you automatically.

Unlike taking pictures with a device camera, capturing video requires a very particular call order. You must follow a specific order of execution to successfully prepare for and capture video with your application, as detailed below.

  1. Open Camera — Use the Camera.open() to get an instance of the camera object.
  2. Connect Preview — Prepare a live camera image preview by connecting a SurfaceView to the camera using Camera.setPreviewDisplay() .
  3. Start Preview — Call Camera.startPreview() to begin displaying the live camera images.
  4. Start Recording V >MediaRecorder by calling Camera.unlock() .
  5. Configure MediaRecorder — Call in the following MediaRecorder methods in this order. For more information, see the MediaRecorder reference documentation.
    1. setCamera() — Set the camera to be used for v >Camera .
    2. setAudioSource() — Set the audio source, use MediaRecorder.AudioSource.CAMCORDER .
    3. setVideoSource() — Set the v >MediaRecorder.VideoSource.CAMERA .
    4. Set the v >MediaRecorder.setProfile method, and get a profile instance using CamcorderProfile.get() . For versions of Andro >setOutputFormat() — Set the output format, specify the default setting or MediaRecorder.OutputFormat.MPEG_4 .
    5. setAudioEncoder() — Set the sound encoding type, specify the default setting or MediaRecorder.AudioEncoder.AMR_NB .
    6. setVideoEncoder() — Set the v >MediaRecorder.VideoEncoder.MPEG_4_SP .
  6. setOutputFile() — Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() from the example method in the Saving Media Files section.
  7. setPreviewDisplay() — Specify the SurfaceView preview layout element for your application. Use the same object you specified for Connect Preview.

Caution: You must call these MediaRecorder configuration methods in this order, otherwise your application will encounter errors and the recording will fail.

  • Prepare MediaRecorder — Prepare the MediaRecorder with prov >MediaRecorder.prepare() .
  • Start MediaRecorder — Start recording v >MediaRecorder.start() .

  • Stop Recording V >MediaRecorder.stop() .
  • Reset MediaRecorder — Optionally, remove the configuration settings from the recorder by calling MediaRecorder.reset() .
  • Release MediaRecorder — Release the MediaRecorder by calling MediaRecorder.release() .
  • Lock the Camera — Lock the camera so that future MediaRecorder sessions can use it by calling Camera.lock() . Starting with Andro >MediaRecorder.prepare() call fails.
  • Stop the Preview — When your activity has finished using the camera, stop the preview using Camera.stopPreview() .
  • Release Camera — Release the camera so that other applications can use it by calling Camera.release() .
  • Note: It is possible to use MediaRecorder without creating a camera preview first and skip the first few steps of this process. However, since users typically prefer to see a preview before starting a recording, that process is not discussed here.

    Tip: If your application is typically used for recording v >setRecordingHint(boolean) to true prior to starting your preview. This setting can help reduce the time it takes to start recording.

    Configuring MediaRecorder

    When using the MediaRecorder >MediaRecorder.prepare() method to check and implement the configuration. The following example code demonstrates how to properly configure and prepare the MediaRecorder class for video recording.

    Kotlin

    Prior to Andro >CamcorderProfile . This approach is demonstrated in the following code:

    Kotlin

    The following v >MediaRecorder are given default settings, however, you may want to adjust these settings for your application:

    Starting and stopping MediaRecorder

    When starting and stopping v >MediaRecorder class, you must follow a specific order, as listed below.

    1. Unlock the camera with Camera.unlock()
    2. Configure MediaRecorder as shown in the code example above
    3. Start recording using MediaRecorder.start()
    4. Record the v >MediaRecorder.stop()
    5. Release the media recorder with MediaRecorder.release()
    6. Lock the camera using Camera.lock()

    The following example code demonstrates how to wire up a button to properly start and stop v >MediaRecorder class.

    Note: When completing a video recording, do not release the camera or else your preview will be stopped.

    Kotlin

    Note: In the above example, the prepareVideoRecorder() method refers to the example code shown in Configuring MediaRecorder. This method takes care of locking the camera, configuring and preparing the MediaRecorder instance.

    Releasing the camera

    Cameras are a resource that is shared by applications on a device. Your application can make use of the camera after getting an instance of Camera , and you must be particularly careful to release the camera object when your application stops using it, and as soon as your application is paused ( Activity.onPause() ). If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

    To release an instance of the Camera object, use the Camera.release() method, as shown in the example code below.

    Kotlin

    Caution: If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

    Saving media files

    Media files created by users such as pictures and videos should be saved to a device’s external storage directory (SD Card) to conserve system space and to allow users to access these files without their device. There are many possible directory locations to save media files on a device, however there are only two standard locations you should consider as a developer:

    • Environment.getExternalStoragePublicDirectory ( Environment.DIRECTORY_PICTURES ) — This method returns the standard, shared and recommended location for saving pictures and v >Context.getExternalFilesDir ( Environment.DIRECTORY_PICTURES ) — This method returns a standard location for saving pictures and videos which are associated with your application. If your application is uninstalled, any files saved in this location are removed. Security is not enforced for files in this location and other applications may read, change and delete them.

    The following example code demonstrates how to create a File or Uri location for a media file that can be used when invoking a device’s camera with an Intent or as part of a Building a Camera App.

    Kotlin

    To make the URI support work profiles, first convert the file URI to a content URI. Then, add the content URI to EXTRA_OUTPUT of an Intent .

    For more information about saving files on an Android device, see Data Storage.


    Camera features

    Andro >Camera.Parameters object. However, there are several important features that require more than simple settings in Camera.Parameters . These features are covered in the following sections:

    For general information about how to use features that are controlled through Camera.Parameters , review the Using camera features section. For more detailed information about how to use features controlled through the camera parameters object, follow the links in the feature list below to the API reference documentation.

    Table 1. Common camera features sorted by the Android API Level in which they were introduced.

    Feature API Level Description
    Face Detection 14 Identify human faces within a picture and use them for focus, metering and white balance
    Metering Areas 14 Specify one or more areas within an image for calculating white balance
    Focus Areas 14 Set one or more areas within an image to use for focus
    White Balance Lock 14 Stop or start automatic white balance adjustments
    Exposure Lock 14 Stop or start automatic exposure adjustments
    Video Snapshot 14 Take a picture while shooting video (frame grab)
    Time Lapse Video 11 Record frames with set delays to record a time lapse video
    Multiple Cameras 9 Support for more than one camera on a device, including front-facing and back-facing cameras
    Focus Distance 9 Reports distances between the camera and objects that appear to be in focus
    Zoom 8 Set image magnification
    Exposure Compensation 8 Increase or decrease the light exposure level
    GPS Data 5 Include or omit geographic location data with the image
    White Balance 5 Set the white balance mode, which affects color values in the captured image
    Focus Mode 5 Set how the camera focuses on a subject such as automatic, fixed, macro or infinity
    Scene Mode 5 Apply a preset mode for specific types of photography situations such as night, beach, snow or candlelight scenes
    JPEG Quality 5 Set the compression level for a JPEG image, which increases or decreases image output file quality and size
    Flash Mode 5 Turn flash on, off, or use automatic setting
    Color Effects 5 Apply a color effect to the captured image such as black and white, sepia tone or negative.
    Anti-Banding 5 Reduces the effect of banding in color gradients due to JPEG compression
    Picture Format 1 Specify the file format for the picture
    Picture Size 1 Specify the pixel dimensions of the saved picture

    Note: These features are not supported on all devices due to hardware differences and software implementation. For information on checking the availability of features on the device where your application is running, see Checking feature availability.

    Checking feature availability

    The first thing to understand when setting out to use camera features on Android devices is that not all camera features are supported on all devices. In addition, devices that support a particular feature may support them to different levels or with different options. Therefore, part of your decision process as you develop a camera application is to decide what camera features you want to support and to what level. After making that decision, you should plan on including code in your camera application that checks to see if device hardware supports those features and fails gracefully if a feature is not available.

    You can check the availability of camera features by getting an instance of a camera’s parameters object, and checking the relevant methods. The following code sample shows you how to obtain a Camera.Parameters object and check if the camera supports the autofocus feature:

    Kotlin

    You can use the technique shown above for most camera features. The Camera.Parameters object prov >getSupported. () , is. Supported() or getMax. () method to determine if (and to what extent) a feature is supported.

    If your application requires certain camera features in order to function properly, you can require them through additions to your application manifest. When you declare the use of specific camera features, such as flash and auto-focus, Google Play restricts your application from being installed on devices which do not support these features. For a list of camera features that can be declared in your app manifest, see the manifest Features Reference.

    Using camera features

    Most camera features are activated and controlled using a Camera.Parameters object. You obtain this object by first getting an instance of the Camera object, calling the getParameters() method, changing the returned parameter object and then setting it back into the camera object, as demonstrated in the following example code:

    Kotlin

    This technique works for nearly all camera features, and most parameters can be changed at any time after you have obtained an instance of the Camera object. Changes to parameters are typically visible to the user immediately in the application’s camera preview. On the software side, parameter changes may take several frames to actually take effect as the camera hardware processes the new instructions and then sends updated image data.

    Important: Some camera features cannot be changed at will. In particular, changing the size or orientation of the camera preview requires that you first stop the preview, change the preview size, and then restart the preview. Starting with Android 4.0 (API Level 14) preview orientation can be changed without restarting the preview.

    Other camera features require more code in order to implement, including:

    • Metering and focus areas
    • Face detection
    • Time lapse video

    A quick outline of how to implement these features is provided in the following sections.

    Metering and focus areas

    In some photographic scenarios, automatic focusing and light metering may not produce the desired results. Starting with Android 4.0 (API Level 14), your camera application can provide additional controls to allow your app or users to specify areas in an image to use for determining focus or light level settings and pass these values to the camera hardware for use in capturing images or video.

    Areas for metering and focus work very similarly to other camera features, in that you control them through methods in the Camera.Parameters object. The following code demonstrates setting two light metering areas for an instance of Camera :

    Kotlin

    The Camera.Area object contains two data parameters: A Rect object for specifying an area within the camera’s field of view and a weight value, which tells the camera what level of importance this area should be given in light metering or focus calculations.

    The Rect field in a Camera.Area object describes a rectangular shape mapped on a 2000 x 2000 unit grid. The coordinates -1000, -1000 represent the top, left corner of the camera image, and coordinates 1000, 1000 represent the bottom, right corner of the camera image, as shown in the illustration below.

    Figure 1. The red lines illustrate the coordinate system for specifying a Camera.Area within a camera preview. The blue box shows the location and shape of an camera area with the Rect values 333,333,667,667.

    The bounds of this coordinate system always correspond to the outer edge of the image visible in the camera preview and do not shrink or expand with the zoom level. Similarly, rotation of the image preview using Camera.setDisplayOrientation() does not remap the coordinate system.

    Face detection

    For pictures that include people, faces are usually the most important part of the picture, and should be used for determining both focus and white balance when capturing an image. The Android 4.0 (API Level 14) framework provides APIs for identifying faces and calculating picture settings using face recognition technology.

    Using the face detection feature in your camera application requires a few general steps:

    • Check that face detection is supported on the device
    • Create a face detection listener
    • Add the face detection listener to your camera object
    • Start face detection after preview (and after every preview restart)

    The face detection feature is not supported on all devices. You can check that this feature is supported by calling getMaxNumDetectedFaces() . An example of this check is shown in the startFaceDetection() sample method below.

    In order to be notified and respond to the detection of a face, your camera application must set a listener for face detection events. In order to do this, you must create a listener >Camera.FaceDetectionListener interface as shown in the example code below.

    Kotlin

    After creating this >Camera object, as shown in the example code below:

    Работа с камерой в Andro >09.04.2013, 22:48. Просмотров 3163. Ответов 9


    Всем привет. Сразу говорю — на java не писал никогда — только delphi и немного C++.
    Хочется сделать приложение для Андроид 2.3.5 (конкретно HTC Wildfire): чтобы при нажатии на кнопку на гарнитуре включалась камера, при повторном — выключалась. Не буду пока спрашивать как это сделать.
    Вопрос прямой — такое вообще возможно сделать? Или функцию данной клавиши отловить не возможно? Причем нужно чтобы открывалось в блокированном режиме телефона.

    Очень благодарен буду советам знающих эту платформу.

    PS: как собрать файл установки на телефон apk? Где вообще это делается? Eclipse, JRE, Android SDK есть, работает.

    Добавлено через 3 часа 16 минут
    Все еще актуально

    Добавлено через 13 часов 25 минут
    Up!

    Добавлено через 14 часов 48 минут
    Неужели никто не ответит?

    09.04.2013, 22:48

    Работа с камерой в Android 2.*
    Нужно заставить приложение выводить картинку с камеры на экран (превьюшка). Вроде проще простого.

    Управление камерой на OS Android
    Ребята всем привет! Хочу разработать похожую инсталляцию: https://vimeo.com/123304375 .

    Можно ли использовать старое api для работы с камерой в новых версиях android 21+
    Создавал приложение для работы с камерой и тестировал работу на android API 17 все хорош работает.

    Работа с камерой
    Когда приложение использует камеру то изображение которое идет с камеры(видеокадры) отображаются на.

    Android — Android — работа с камерой

    Группа: Главные администраторы
    Сообщений: 14349
    Регистрация: 12.10.2007
    Из: Twilight Zone
    Пользователь №: 1

    Работа с камерой на телефоне всегда представляла для меня интерес. Как же это все устроено… И вот мне в руки попал телефон с Android’ом. Я не преминул возможностью попробовать разобраться в этом. Вот что получилось в итоге.

    Рассмотрим небольшую программу, которая позволяет делать снимки.

    Все операции проводятся с помощью класса Camera.

    Необходимо завести переменную

    и инициализировать ее

    После завершения работы с камерой необходимо сделать

    в противном случае камера останется заблокированной и недоступной для других приложений.

    Для обычных приложений типа фотокамеры инициализацию лучше всего производить в onResume, а освобождение в onPause.

    Обязательным условием при работе с камерой является создание окна предпросмотра (preview). Это окно должно являться объектом класса Surfaceи для отображения на экране подходит SurfaceView.

    Чтобы задать preview, необходимо вызвать метод setPreviewDisplay, параметром которого является объект класса SurfaceHolder.

    SurfaceHolder surfaceHolder;
    surfaceHolder = preview.getHolder();
    camera.setPreviewDisplay(surfaceHolder);

    Чтобы включить отображение preview, вызываем

    Если этого не сделать, то камера не сможет делать снимки.

    Собственно для того, чтобы сделать снимок, необходимо вызвать метод

    void takePicture(Camera.ShutterCalback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpg);

    С помощью параметров (кстати, любой из них может быть null) задаются обработчики разных событий:

    • shutter — вызывается в момент получения изображения с матрицы
    • raw — программе передаются для обработки raw данные (если поддерживается аппаратно)
    • postview — программе передаются полностью обработанные данные (если поддерживается аппаратно)
    • jpg — программе передается изображение в виде jpg. Здесь можно организовать запись изображения на карту памяти.

    Вызов takePicture можно поместить непосредственно в обработчик onClick кнопки — в этом случае фотографирование произойдет сразу после нажатия на нее, но можно и воспользоваться предварительной автофокусировкой.

    В этом случае задается обработчик Camera.AutoFocusCallback, в котором необходимо реализовать метод

    public void onAutoFocus(boolean paramBoolean, Camera paramCamera);

    Тогда после вызова в обработчике нажатия на кнопку camera.autoFocus(), однократно будет вызван обработчик, в котором мы уже и примем решение об удачной фокусировке и необходимости сделать снимок.

    Для работы с SurfaceHolder можно задать SurfaceHolder.Callback

    В этом случае необходимо реализовать методы

    public void surfaceCreated(SurfaceHolder holder);
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height);
    public void surfaceDestroyed(SurfaceHolder holder);

    C помощью них приложению будет сообщаться о том, что Surface успешно создано, если оно изменено или то, что оно удалено.


    Размер нашего preview можно менять в процессе выполнения программы:

    LayoutParams lp = preview.getLayoutParams();
    lp.w >lp.height = задаваемая высота;
    preview.setLayoutParams(lp);

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

    В противном случае нам придется, например, в surfaceCreated проверять расположение экрана и поворачивать preview с помощью, например, camera.setDisplayOrientation(0).

    Это не очень удобно, потому что поворот экрана занимает какое-то время. В этот момент происходит вызов onPause и onResume, пересоздается Surface.

    Также имеется возможность объявить обработчик Camera.PreviewCallback, с помощью которого путем реализации метода

    void onPreviewFrame(byte[] paramArrayOfByte, Camera paramCamera);

    можно получать и обрабатывать каждый кадр, отображаемый в preview.

    И последний важный момент. Чаще всего получается так, что отношение сторон SurfaceView отличается от отношения сторон в preview камеры. Поэтому для того, чтобы избежать искажений изображения на экране, необходимо подкорректировать размер отображаемого окна предпросмотра.

    Чуть не забыл. В манифест необходимо добавить permission

    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.content.res.Configuration;
    import android.os.Bundle;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.ViewGroup.LayoutParams;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.view.View;

    import android.hardware.Camera;
    import android.hardware.Camera.Size;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;

    public class MainScreen extends Activity implements SurfaceHolder.Callback, View.OnClickListener, Camera.PictureCallback, Camera.PreviewCallback, Camera.AutoFocusCallback
    <
    private Camera camera;
    private SurfaceHolder surfaceHolder;
    private SurfaceView preview;
    private Button shotBtn;

    @Override
    public void onCreate(Bundle savedInstanceState)
    <
    super.onCreate(savedInstanceState);

    // если хотим, чтобы приложение постоянно имело портретную ориентацию
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    // если хотим, чтобы приложение было полноэкранным
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

    // и без заголовка
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // наше SurfaceView имеет имя SurfaceView01
    preview = (SurfaceView) findViewById(R.id.SurfaceView01);

    surfaceHolder = preview.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    // кнопка имеет имя Button01
    shotBtn = (Button) findViewById(R.id.Button01);
    shotBtn.setText(«Shot»);
    shotBtn.setOnClickListener(this);
    >

    @Override
    protected void onResume()
    <
    super.onResume();
    camera = Camera.open();
    >

    @Override
    protected void onPause()
    <
    super.onPause();

    if (camera != null)
    <
    camera.setPreviewCallback(null);
    camera.stopPreview();
    camera.release();
    camera = null;
    >
    >

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    <
    >

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    <
    try
    <
    camera.setPreviewDisplay(holder);
    camera.setPreviewCallback(this);
    >
    catch (IOException e)
    <
    e.printStackTrace();
    >

    Size previewSize = camera.getParameters().getPreviewSize();
    float aspect = (float) previewSize.width / previewSize.height;

    int previewSurfaceW > int previewSurfaceHeight = preview.getHeight();

    LayoutParams lp = preview.getLayoutParams();

    // здесь корректируем размер отображаемого preview, чтобы не было искажений

    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
    <
    // портретный вид
    camera.setDisplayOrientation(90);
    lp.height = previewSurfaceHeight;
    lp.w > ;
    >
    else
    <
    // ландшафтный
    camera.setDisplayOrientation(0);
    lp.w > lp.height = (int) (previewSurfaceWidth / aspect);
    >

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    <
    >

    @Override
    public void onClick(View v)
    <
    if (v == shotBtn)
    <
    // либо делаем снимок непосредственно здесь
    // либо включаем обработчик автофокуса

    //camera.takePicture(null, null, null, this);
    camera.autoFocus(this);
    >
    >

    @Override
    public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera)
    <
    // сохраняем полученные jpg в папке /sdcard/CameraExample/
    // имя файла — System.currentTimeMillis()

    try
    <
    File saveDir = new File(«/sdcard/CameraExample/»);

    if (!saveDir.exists())
    <
    saveDir.mkdirs();
    >

    FileOutputStream os = new FileOutputStream(String.format(«/sdcard/CameraExample/%d.jpg», System.currentTimeMillis()));
    os.write(paramArrayOfByte);
    os.close();
    >
    catch (Exception e)
    <
    >

    // после того, как снимок сделан, показ превью отключается. необходимо включить его
    paramCamera.startPreview();
    >

    @Override
    public void onAutoFocus(boolean paramBoolean, Camera paramCamera)
    <
    if (paramBoolean)
    <
    // если удалось сфокусироваться, делаем снимок
    paramCamera.takePicture(null, null, null, this);
    >
    >

    @Override
    public void onPreviewFrame(byte[] paramArrayOfByte, Camera paramCamera)
    <
    // здесь можно обрабатывать изображение, показываемое в preview
    >
    >

    Программа отлаживалась и тестировалась на телефоне LG Optimus One P500.

    При написании использовались следующие источники информации:

    Цукерберг рекомендует:  Коворкинг - Коворкинг в Москве!
    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих