2013-03-25 4 views
6

Я видел различные способы проверки того, является ли тип возвращаемого носителя в -imagePickerController:didFinishPickingMediaWithInfo: видео. Например, мой путь:Определите, является ли тип медиаданных изображений видео

- (void)imagePickerController:(UIImagePickerController *)imagePicker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    if (UTTypeEqual(kUTTypeMovie, 
    (__bridge CFStringRef)[info objectForKey:UIImagePickerControllerMediaType])) 
    { 
     // ... 
    } 
} 

или

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) { 

или

if ([mediaType isEqualToString:(NSString *)kUTTypeVideo] || 
    [mediaType isEqualToString:(NSString *)kUTTypeMovie]) 

или

if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) 
     == kCFCompareEqualTo) 

или

if ([mediaType isEqualToString:@"public.movie"] 

Кажется, что у всех есть разные способы сделать это. Каков рекомендуемый метод проверки типа носителя? Предпочтительно, чтобы включить «все типы изображений» или «все типы видео».

ответ

2

Я хотел бы сказать, разница между первым способом UTTypeEqual и вторым и третьим методами (NSString сравнения), является вопросом предпочтения в решении CFStringRefs или NSStrings.

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

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

Возможно, я зарегистрируюсь на kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4.

Полный список из UTType Reference

kUTTypeAudiovisualContent 
An abstract type identifier for audio and/or video content. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMovie 
An abstract type identifier for a media format which may contain both video and audio. Corresponds to what users would label a "movie" 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeVideo 
An abstract type identifier for pure video data(no audio). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeAudio 
An abstract type identifier for pure audio data (no video). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeQuickTimeMovie 
The type identifier for a QuickTime movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG 
The type identifier for a MPEG-1 or MPEG-2 movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG4 
The type identifier for a MPEG-4 movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMP3 
The type identifier for MP3 audio. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG4Audio 
The type identifier for a MPEG-4 audio layer (.m4a, or the MIME type audio/MP4). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeAppleProtectedMPEG4Audio 
The type identifier for Apple protected MPEG4 format (.m4p, iTunes music store format). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 
13

Было бы лучше, чтобы проверить на соответствие с определенным ИМП вместо этого.

Прямо сейчас, iOS сообщает вам свой public.movie, но что он скажет в следующем году? Вы увидите, что люди также проверяют public.video. Отлично, поэтому у вас жестко закодированы два типа, а не один.

Но не лучше ли спросить: «Это фильм?» а не жесткий код конкретного типа, который, по вашему мнению, iOS вернется? Там есть способ сделать это:

NSString *mediaType = info[UIImagePickerControllerMediaType]; 
BOOL isMovie = UTTypeConformsTo((__bridge CFStringRef)mediaType, 
           kUTTypeMovie) != 0; 

Используя этот подход, isMovie должен быть YES, если фильм возвращается (независимо от того, который возвращается конкретный тип), если MEDIATYPE представляет фильм, так как все фильмы соответствуют от kUTTypeMovie. Чтобы быть действительно понятным, если это kUTTypeVideo, это также распознает его как фильм, потому что kUTTypeVideo соответствует kUTTypeMovie.

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

NSString *mediaType = info[UIImagePickerControllerMediaType]; 
BOOL isImage = UTTypeConformsTo((__bridge CFStringRef)mediaType, 
           kUTTypeImage) != 0; 

isIamge должен быть YES, если изображение возвращается, так как все изображения соответствуют kUTTypeImage.

Просмотреть дерево (частичное) типа Apple (здесь): Uniform Type Identifiers Are Declared in a Conformance Hierarchy. Вы можете получить меньше полезный, но более полный список всех ИМП в настоящее время признанного вашей системы и их соответствия из оболочки с:

/System/Library/Frameworks/CoreServices.framework/Frameworks\ 
/LaunchServices.framework/Versions/A/Support/lsregister -dump 

В частности, вы можете увидеть public.video определяются следующим образом:

-------------------------------------------------------- 
type id:   8344 
    uti:   public.video 
    description: video 
    flags:   exported active core apple-internal trusted 
    icon:   
    conforms to: public.movie 
    tags:   
-------------------------------------------------------- 

Обратите внимание, что UTTypeConformsTo возвращает true, если типы одинаковы. Из документов Apple:

Возвращает true, если идентификатор однородного типа равен или соответствует второму типу.

+1

Не уверен, как это сидела здесь без каких-либо голосов в течение столь длительного времени. Это лучший подход, который я видел на SO. – Toby

+0

Мне тоже нравится ваш подход. Thx много для этого решения. – iWheelBuy

+0

Как только вы натыкаетесь на эти API, это действительно единственное, что имеет смысл вообще. :) –