Показаны сообщения с ярлыком сохранить. Показать все сообщения
Показаны сообщения с ярлыком сохранить. Показать все сообщения

среда, 8 января 2014 г.

Работа с фото видео камерой в IOS IPhone используя UIImagePickerController

У многих разработчиков мобильных приложений возникает вопрос о реализации работы с камерой. Я уже описывал этот процесс для Android теперь хочу сделать краткое описание для IOS на IPhone. Речь пойдёт именно об использовании UIImagePickerController как самого простого способа. Описывать подробно создание проекта и установки кнопки в storyboard я не буду это вы можете посмотреть в моей прошлой статье.

Предпочитается, что у вас уже есть кнопка по которой мы хотим вызвать камеру и получить например фото после того как вы нажмете фотографировать. Поэтому я опишу лишь методы которые необходимо реализовать в класе вашего ViewCotroller-а.
Итак вызов камеры:
-(IBAction) makePhoto:(id)sender{
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]){
// Создание image picker controller
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// Устанавливаем сорс для камеры
imagePicker.sourceType =  UIImagePickerControllerSourceTypeCamera;
imagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh;
// Текущий Delegate
imagePicker.delegate = self;
imagePicker.mediaTypes = [UIImagePickerController  availableMediaTypesForSourceType:imagePicker.sourceType];
// Показываем image picker
[self presentModalViewController:imagePicker animated:YES];
}else{
NSLog(@»Ваше устройство не поддерживает эту функцию»);
}
}
В этом методе мы настраиваем UIImagePickerController и показываем пользователю активность в которой он работает, и соответственно можно сделать фото. Поскольку делегатом является self,  то есть реализация методов обработки полученных результатов должна быть в этом же классе.
Подвяжите метод типа IBAction к кнопке на Tuch up inside и запустите проект. Конечноже проверять необходимо на реальном устройстве, так как на эмуляторе камеры нет и в системный лог вы получите сообщение «Ваше устройство не поддерживает эту функцию». так как в строке
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]){
мы проверяем наличие камеры на устройстве. Итак если вы запустите проект на реальном устроействе и нажмете на свою кнопку то увидите, что запустилась активность камеры, теперь можно сделать фото. Но после нажатия кнопки Use ничего не произойдет так как нам нужно реализовать ещё метод - (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info поскльку делегатом для UIImagePickerController является данный класс в котором он вызван,
Итак код метода:
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
//определить медиа тип файла
NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ( [ mediaType isEqualToString:@"public.image" ]) { //если файл – изображение
// Берем изображение из информации словаря
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
//получить путь к файлу
NSURL* imagePath = (NSURL *)[info valueForKey:UIImagePickerControllerReferenceURL];
NSString* chosed_imagePath = [imagePath path];
//формируем file-data изображения
NSData* imageData = UIImageJPEGRepresentation(image, 1.0);
}else if ( [ mediaType isEqualToString:@"public.movie" ]){ // пользователь снял видео
NSString *moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
}
}
Теперь подробнее. Как видно из данного примера мы можем получить 2 типа контента с камеры: фото и видео. У данных о фотографии мы можем получить путь, url и NSData то есть само байтовое представление файла, и  что немало важно NSData хранится в памяти и если вам не нужны эти данные лучше не хнатить их в ОЗУ а пользоваться файлом на мобильном устройстве . Поэтому как дальше работать с этими данными вам решать) У видео файла также можно получить путь и NSData но в отличии от фото оно уже в медиа-галерее вашего устройства. И так опишу ещъ один метод для сохранения изображения в медиа галерею для дальнейшей работы с ним.
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
Как вы видите в качетсве входного параметра в этом методе используется image объект типа UIImage полученный нами из камеры. Еесли вам это нужно используйте это вот так:
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
//определить медиа тип файла
NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ( [ mediaType isEqualToString:@"public.image" ]) { //если файл – изображение
// Берем изображение из информации словаря
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}else if ( [ mediaType isEqualToString:@"public.movie" ]){ // пользователь снял видео
NSString *moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
}
}
Конечно возможно вам понадобится обработчик didFinishSavingWithError – это метод который выполнится после сохранения рисунка и может содержать ошибку, о которой нужно сообщить пользователю
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error
contextInfo:(void *)contextInfo
{
// проверка на ошибки
if (error != NULL) {
// показать ошибку…
UIAlertView* minhaCritica = [UIAlertView new];
minhaCritica.title = @»Ошибка»;
[minhaCritica addButtonWithTitle:@"Ок"];
minhaCritica.message = @»Фото не сохранилось»;
minhaCritica.delegate = self;
[minhaCritica show];
[minhaCritica release];
//это обычный алерт с кнопкной ОК и сообщением
} else  // ошибок нет
{
// показать сообщение о том что картинка сохранена
UIAlertView* minhaCritica = [UIAlertView new];
minhaCritica.title = @»Успешно»;
[minhaCritica addButtonWithTitle:@"Ок"];
minhaCritica.message = @»Фото  сохранилось»;
minhaCritica.delegate = self;
[minhaCritica show];
[minhaCritica release];
}
}
Как мы видим в обработчике идет проверка на ошибку и два варианта или успешно или неудачно тогда покажем alert с тем или иным тектом. Теперь можно запустить проект и проверить как работает получение фото с камеры и сохраненеи в галерею.

понедельник, 28 октября 2013 г.

Работа с фото камерой в Android

В этой статье я хочу рассказать как запустить фото камеру из вашего android приложения, а также как сделать снимок и сохранить полученное фото. Предполагается что у вас уже установлена среда разработки например eclipse и настроен Android SDK.
Для начала необходимо внести изменения в файл AndroidManifest.xml, он находится в корне проекта. Если он октрыт у вас на вкладке Manifest, то вам нужно выбрать AndroidManifest.xml. Далее необходимо добавить следующий код.




здесь мы запрашиваем права на использование камерой и на использование внешним хранилищем данных например SD картой.
Далее можно работать с файлом описывающим работу активности вашего приложения, в моём случае это MainActivity.java
Код который нужно вставить либо в метод public void onCreate(Bundle savedInstanceState) { либо создать отдельный метод. Так как в первом случае камера вызовется сразу после запуска приложения.
public class MainActivity extends Activity {
private static final int CAMERA_RESULT = 100;
public static final int MEDIA_TYPE_IMAGE = 1;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String timeStamp = new SimpleDateFormat(«yyyyMMdd_HHmmss»).format(new Date(0, 0, 0));
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, «IMG_» + timeStamp + «.jpg»);
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(cameraIntent, CAMERA_RESULT);
}
И так поясню что гле:
private static final int CAMERA_RESULT = 100;    это константа для работы с камерй. она обязательна
И так после того как мы объявим в setContentView нашу активность нужно создать имя файла в которое будет писаться снимок фотокамеры.
Что собственно и описано в следующих строках
String timeStamp = new SimpleDateFormat(«yyyyMMdd_HHmmss»).format(new Date(0, 0, 0));
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, «IMG_» + timeStamp + «.jpg»);
Далее объявим событие вызова фото камеры.
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Теперь скажем куда сохранить полученый рисунок
fileUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
fileUri это константа типа Uri она хранит путь к файлу снимка на карте памяти.
Далее
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  тут мы собственно задаём путь куда сохранить фотку.
И вызываем камеру startActivityForResult(cameraIntent, CAMERA_RESULT);
Теперь необходимо написать метод обработки событий фотокамеры onActivityResult, это стандартное название. Он получает фотографию сделанную с камеры и мы сможем её обработать.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ImageView photoimg = (ImageView)findViewById(R.id.iv_camera);
if (requestCode == CAMERA_RESULT) {
if (resultCode == RESULT_OK) {
if(fileUri != null) {
//устанавливаем превью картинки
photoimg.setImageURI(fileUri);
}
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
}
Итак
ImageView photoimg = (ImageView)findViewById(R.id.iv_camera);
это созданный обобьет рисунка на layout-е activity_main.xml
вот его структура

android:id=»@+id/iv_camera»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignLeft=»@+id/textView1″
android:layout_centerVertical=»true»
android:src=»@drawable/ic_launcher» />

Это необходимо добавить на ctivity_main.xml, что бы мы могли увидеть потом что получилось в результате съёма фото.
if (requestCode == CAMERA_RESULT) {
тут мы проверяем пришел ли результат от камеры

if (resultCode == RESULT_OK) {  если всё ок
if(fileUri != null) { и не пуст файл в который сохраняется фото
//устанавливаем превью картинки
photoimg.setImageURI(fileUri);  выведем это фото в нашем окне приложения
}
}

И так мы имеем возможно вызвать камеру делать снимки и сохранять их на SD карту.
Так же если подключить телефон к компьютером где установлена среда разработки и запустить приложение на выполнение кнопкой RUN то оно автоматически установится на телефон и запустится.