Обсуждение

Обсуждение

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

• камеру — для этого данному методу сообщается значение UIImagePickerControllerSourceTypeCamera;

• библиотеку фотографий — для этого данному методу сообщается значение UIImagePickerControllerSourceTypePhotoLibrary. В результате включается обзор корневого каталога в директории Photos на устройстве;

• каталог с фотографиями, отснятыми с камеры данного устройства (Camera Roll), — в таком случае метод получает значение UIImagePickerControllerSourceTypeSavedPhotosAlbum.

Если вы собираетесь проверить доступность любой из этих функций на устройстве с iOS, нужно передать описанные значения методу класса isSourceTypeAvailable:, относящемуся к классу UIImagePickerController, и лишь потом попробовать отобразить для пользователя соответствующий интерфейс.

Теперь можно воспользоваться методами класса isSourceTypeAvailable: и availableMediaTypesForSourceType:, относящимися к классу UIImagePickerController, чтобы для начала определить, доступен ли источник медийной информации (например, камера, библиотека фотографий и т. д.). Если источник имеется, определим, какие типы медиаинформации (например, изображения или видео) в нем предоставляются:

— (BOOL) cameraSupportsMedia:(NSString *)paramMediaType

sourceType:(UIImagePickerControllerSourceType)paramSourceType{

__block BOOL result = NO;

if ([paramMediaType length] == 0){

NSLog(@"Media type is empty.");

return NO;

}

NSArray *availableMediaTypes =

[UIImagePickerController

availableMediaTypesForSourceType: paramSourceType];

[availableMediaTypes enumerateObjectsUsingBlock:

^(id obj, NSUInteger idx, BOOL *stop) {

NSString *mediaType = (NSString *)obj;

if ([mediaType isEqualToString: paramMediaType]){

result = YES;

*stop= YES;

}

}];

return result;

}

— (BOOL) doesCameraSupportShootingVideos{

return [self cameraSupportsMedia:(__bridge NSString *)kUTTypeMovie

sourceType: UIImagePickerControllerSourceTypeCamera];

}

— (BOOL) doesCameraSupportTakingPhotos{

return [self cameraSupportsMedia:(__bridge NSString *)kUTTypeImage

sourceType: UIImagePickerControllerSourceTypeCamera];

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if ([self doesCameraSupportTakingPhotos]){

NSLog(@"The camera supports taking photos.");

} else {

NSLog(@"The camera does not support taking photos");

}

if ([self doesCameraSupportShootingVideos]){

NSLog(@"The camera supports shooting videos.");

} else {

NSLog(@"The camera does not support shooting videos.");

}

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Мы приводим типы значений kUTTypeMovie и kUTTypeImage к NSString с помощью __bridge (как было рассказано в разделе 1.18). Это объясняется тем, что два вышеупомянутых значения относятся к типу CFStringRef и нам нужно получить их представление в виде NSString. Чтобы упростить работу статического анализатора и компилятора и не получать от компилятора лишних сообщений, лучше выполнить такое приведение типов.

На некоторых устройствах с iOS может быть установлена не одна камера. Например, их может быть две — передняя и задняя. Чтобы определить, доступны ли эти камеры, воспользуйтесь методом класса isCameraDeviceAvailable:, относящимся к классу UIImagePickerController:

— (BOOL) isFrontCameraAvailable{

return [UIImagePickerController

isCameraDeviceAvailable: UIImagePickerControllerCameraDeviceFront];

}

— (BOOL) isRearCameraAvailable{

return [UIImagePickerController

isCameraDeviceAvailable: UIImagePickerControllerCameraDeviceRear];

}

Если вызвать эти методы на не самом новом iPhone, где отсутствует задняя камера, то можно заметить, что метод isFrontCameraAvailable возвращает NO, а метод isRearCameraAvailable — YES. При запуске данного кода на iPhone, оснащенном как передней, так и задней камерами, оба метода вернут YES, поскольку на iPhone 4 имеются две камеры — спереди и сзади.

Если в вашем приложении недостаточно просто определить, какая камера имеется на устройстве, можно получить и другие настройки, воспользовавшись классом UIImagePickerController. Одна из этих настроек позволяет узнать, есть ли на камере данного устройства функция вспышки. Метод класса isFlashAvailableForCameraDevice:, относящийся к классу UIImagePickerController, применяется, чтобы выяснить, на какой камере доступна функция вспышки — передней или задней. Не забывайте также, что метод класса isFlashAvailableForCameraDevice:, относящийся к классу UIImagePickerController, сначала проверяет доступность запрошенной камеры, а уже потом проверяется доступность функции вспышки на этой камере. Поэтому методы, которые мы здесь реализуем, можно будет запускать и на устройствах, лишенных передней или задней камеры, без необходимости предварительной проверки доступности камеры:

— (BOOL) isFlashAvailableOnFrontCamera{

return [UIImagePickerController isFlashAvailableForCameraDevice:

UIImagePickerControllerCameraDeviceFront];

}

— (BOOL) isFlashAvailableOnRearCamera{

return [UIImagePickerController isFlashAvailableForCameraDevice:

UIImagePickerControllerCameraDeviceRear];

}

Теперь, если воспользоваться всеми методами, написанными в этом разделе, и протестировать их, например, в делегате нашего приложения, мы сможем увидеть результаты на различных устройствах:

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if ([self isFrontCameraAvailable]){

NSLog(@"The front camera is available.");

if ([self isFlashAvailableOnFrontCamera]){

NSLog(@"The front camera is equipped with a flash");

} else {

NSLog(@"The front camera is not equipped with a flash");

}

} else {

NSLog(@"The front camera is not available.");

}

if ([self isRearCameraAvailable]){

NSLog(@"The rear camera is available.");

if ([self isFlashAvailableOnRearCamera]){

NSLog(@"The rear camera is equipped with a flash");

} else {

NSLog(@"The rear camera is not equipped with a flash");

}

} else {

NSLog(@"The rear camera is not available.");

}

if ([self doesCameraSupportTakingPhotos]){

NSLog(@"The camera supports taking photos.");

} else {

NSLog(@"The camera does not support taking photos");

}

if ([self doesCameraSupportShootingVideos]){

NSLog(@"The camera supports shooting videos.");

} else {

NSLog(@"The camera does not support shooting videos.");

}

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Вот результаты запуска данного приложения на новом iPhone:

The front camera is available. // передняя камера доступна

The front camera is not equipped with a flash // передняя камера

// не оснащена функцией вспышки

The rear camera is available. // задняя камера доступна

The rear camera is equipped with a flash // задняя камера оснащена

, // функцией вспышки

The camera supports taking photos. // камера позволяет делать

, // фотоснимки

The camera supports shooting videos. // камера позволяет

// записывать видео

Вот вывод того же кода при запуске на симуляторе iPhone:

The front camera is not available. // передняя камера недоступна

The rear camera is not available. // задняя камера недоступна

The camera does not support taking photos // камера не поддерживает съемку фотографий

The camera does not support shooting videos // камера не поддерживает съемку видео

Данный текст является ознакомительным фрагментом.



Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Обсуждение

Из книги автора

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


Обсуждение

Из книги автора

Обсуждение Фреймворк Assets Library — удобный посредник между разработчиком и библиотекой фотографий. Как будет указано в разделе 13.6, в iOS SDK вам предоставляются встроенные компоненты графического пользовательского интерфейса, которыми можно пользоваться для доступа к


Обсуждение

Из книги автора

Обсуждение Чтобы пользователь мог выбирать фотоснимки или видеоролики из своей библиотеки фотографий, необходимо установить свойство sourceType экземпляра UIImagePickerController в значение UIImagePickerControllerSourceTypePhotoLibrary и только потом открывать перед пользователем инструмент для выбора


Обсуждение

Из книги автора

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


Обсуждение

Из книги автора

Обсуждение Класс UIVideoEditorController, содержащийся в iOS SDK, позволяет программисту вывести на экран перед пользователем специальный интерфейс для редактирования. Все, что требуется сделать, — предоставить URL видеоролика, который предполагается отредактировать, а потом


Обсуждение

Из книги автора

Обсуждение В зависимости от того, на работу в какой версии iOS рассчитано ваше приложение, его можно запускать и выполнять на различных устройствах, где установлены разные версии iOS. Например, вы можете разрабатывать приложение в последней версии iOS SDK, но в качестве целевой


Обсуждение

Из книги автора

Обсуждение Когда приложение переходит в фоновый режим, работа его основного потока приостанавливается. Потоки, которые вы создаете в своем приложении с помощью метода класса detachNewThreadSelector: toTarget: withObject:, относящегося к классу NSThread, также приостанавливаются. Если вы


Обсуждение

Из книги автора

Обсуждение Многие приложения, ежедневно поступающие на рынок App Store, обладают возможностями соединения с теми или иными серверами. Некоторые выбирают с сервера данные для обновления, другие отсылают информацию на сервер и т. д. В течение долгого времени в iOS существовал


Обсуждение

Из книги автора

Обсуждение В iOS приложение может запросить продолжить воспроизведение своих аудиофайлов, даже если оно само переходит в фоновый режим. В этом разделе мы воспользуемся плеером AVAudioPlayer, который прост и удобен в обращении. Наша задача — запустить аудиоплеер и воспроизвести


Обсуждение

Из книги автора

Обсуждение Когда приложение работает в приоритетном режиме, можно получать от экземпляра CLLocationManager делегатные сообщения, информирующие вас о том, что iOS обнаружила перемещение устройства на новое место. Однако если приложение переходит в фоновый режим и становится


Обсуждение

Из книги автора

Обсуждение Допустим, пустое приложение iOS (то есть приложение всего с одним окном, для которого еще не написан код) впервые запускается на устройстве с iOS, поддерживающем работу в многозадачном режиме. Оно запускается именно впервые, а не возвращается из фонового режима в


Обсуждение

Из книги автора

Обсуждение При работе с приложениями, которые используют класс NSURLConnection, но, уходя в фоновый режим, не запрашивают у iOS дополнительного времени, обращаться с соединениями не составляет никакого труда. Рассмотрим на примере, как будет действовать асинхронное соединение,


Обсуждение

Из книги автора

Обсуждение Пока ваше приложение работает в фоновом режиме, может произойти многое! Например, пользователь может вдруг изменить локализацию устройства с iOS на странице Settings (Настройки) и задать, к примеру, испанский язык вместо английского. Приложения могут


Обсуждение

Из книги автора

Обсуждение В приложениях, написанных для iOS, файл пакета настроек может быть предоставлен пользователю для внесения собственных настроек. Эти настройки будут доступны пользователю в приложении (Settings) на устройстве. Чтобы лучше понять, как работает этот механизм,


Обсуждение

Из книги автора

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