Translate

среда, 11 июля 2012 г.

Использование камеры в android приложениях. Основные понятия. Захват фото и видео

Эта статья представляет собой перевод начала этого официального мануала. В ней вы найдете:     
 -изложение теоретических основ использования камеры в android приложениях
 -самый простой способ съемки фото или видео


Подумать


Прежде чем использовать камеру в своих приложениях, следует обратить внимание на следующие моменты:
  • Camera Requirement — Наличие камеры на устройстве настолько важно, что без него приложение нельзя установить? Если нет, надо объявить специальный атрибут у разрешений в манифесте.
  • Быстрый захват или собственная камера — Каким образом вы хотите использовать камеру? Вам нужно быстро снять картинку или видеоклип или вы хотите сделать что-то посложнее? В первом случае вполне достаточно использовать стандартное приложение, и просто отправлять ему запросы в виде intent-ов с целью получения медиафайлов. Во втором случае, вам придется углубиться в чтение об использовании API камеры (в этой статье этого нет)
  • Storage — Та медиаинформация, которая будет снята камерой в вашем приложении - должна ли быть видна другим приложениям или нет? А если ваше приложения удалят, должен ли к ним остаться доступ? Читайте про сохранение медиафайлов, чтобы реализовать ваш замысел. (не в этой статье)

 

 

 

Основы


Поддержка работы с камерой осуществляется через следующие классы:
Camera
Это самый главный класс при работе на камерой. Он служит, в частности, для захвата фото или видеозаписи
SurfaceView
Этот класс нужен, чтобы отобразить пользователю окно предпросмотра
MediaRecorder
Класс для записи видео с камеры
Intent
Такие intent-ы как MediaStore.ACTION_IMAGE_CAPTURE или MediaStore.ACTION_VIDEO_CAPTURE могут быть использованы для захвата видео или фото без прямой работы с объектом класса Сamera

 

 

 

Объявления в манифесте


Прежде чем писать код по работе с камерой, необходимо разрешить в манифесте использование некоторых функций:
  • Camera Permission — Позволяет использовать камеру
    <uses-permission android:name="android.permission.CAMERA" />
    Но: Можно не ставить, если ваше приложение работает только через intent-ы
  • Camera Featuresтакже надо объявить об использовании фичей камеры:
    <uses-feature android:name="android.hardware.camera" />

    При добавлении специальных условий использования (permissions, uses-feature) в манифест, и заливке приложения на Google Play, этот сайт будет фильтровать список приложения для пользователя: если приложение использует отсутствующее на устройстве пользователя оборудование, он просто не увидит его в поисковой выдаче сайта.
    Если ваше приложение должно использовать камеру или ее особые фичи только для реализации некоторых функций, и без них приложение тоже можно нормально использовать, следует указывать специальный атрибут required, равный false.
    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • Storage PermissionВ случае, если приложение использует SD-карту для хранения файлов, нужно объявить специальный permission
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • Audio Recording Permission — Нужен для записи звука при захвате видео
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
  • Location Permission — При использовании GPS, нужно потребовать доступ к этим функциям
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

 

 

 

Использование стандартного приложения Camera


Самый быстрый способ - без написания кучи ненужного кода - получить медиафайл - просто попросить стандартное приложение сделать это. Оно сделает снимок или видео, вернется, затем пользователь продолжит работать в вашем приложении.
Как использовать эту технологию:
  1. Создать Camera IntentСуществуют следующие их типы:
    • MediaStore.ACTION_IMAGE_CAPTURE — простит сделать снимок
    • MediaStore.ACTION_VIDEO_CAPTURE— просит сделать видеоролик
  1. Start the Camera Intent — Использовать startActivityForResult(). На время захвата фото или видео пользователь будет находится в Activity стандартного приложения, а затем вернется в ваше
  2. Принять данные — Принять результат записи в onActivityResult()

 

Intent захвата фото 

Intent захвата фото может включать в себя следующую дополнительную информацию:
  • MediaStore.EXTRA_OUTPUT— Это поле является объектом класса Uri и представляет собой путь, куда будет сохраняться файл. Очень желательно установить значение этого поля. В противном случае, файл будет сохранен в директории по умолчанию.



Пример ниже показывает, как послать сообщение стандартному приложению о съемке фотографии:


private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;

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

    // создаем Intent, чтобы сделать фотку
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // устанавливаем директорию выходного файла

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    // запускаем стандартную камеру
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

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

 

Intent захвата видео

Intent захвата видео может включать в себя следующую дополнительную информацию:
  • MediaStore.EXTRA_OUTPUT- — Это поле является объектом класса Uri и представляет собой путь, куда будет сохраняться файл. Очень желательно установить значение этого поля. В противном случае, файл будет сохранен в директории по умолчанию.
  • MediaStore.EXTRA_VIDEO_QUALITY— Качества выходного видео. Чем лучше качество, тем больше размер выходного файла. Может быть 0 (плохое) или 1 (хорошее).
  • MediaStore.EXTRA_DURATION_LIMIT— Максимальное время захвата видео.
  • MediaStoreEXTRA_SIZE_LIMIT — Максимальный размер выходного файла.
Пример ниже показывает, как послать сообщение стандартному приложению о съемке видео:
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;

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

    //create new Intent
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);  // устанавливаем директорию выходного файл

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  

    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // устанавливаем хорошее(1) качество выходного видео 

    // запускаем стандартную камеру
    startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
Результат записи нужно будет обработать в onActivityResult()


Принятие результата записи

Теперь, когда вы вызвали стандартное приложение, пришло время обработать ту информацию, которую оно вам пришлет
Для этого нужно переопределить метод onActivityResult(), как показано ниже.


private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    //Если было снято фото:
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Все прошло успешно, можно проинформировать пользователя об этом
            Toast.makeText(this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // Пользователь отменил съемку
        } else {
            // Произошла ошибка
        }
    }

    //Если было снято видео:
    if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Все прошло успешно, можно проинформировать пользователя об этом
            Toast.makeText(this, "Video saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
             // Пользователь отменил съемку
        } else {
             // Произошла ошибка
        }
    }
}
Если все прошло успешно, медиафайл находится в нужной папке.

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...