确定图像选择器媒体类型是否为视频

时间:2013-03-25 16:15:36

标签: ios cocoa-touch uiimagepickercontroller uti

我见过各种检查-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 个答案:

答案 0 :(得分:15)

最好用特定的UTI检查一致性

现在,iOS告诉你它是public.movie,但它明年会说些什么?您还会看到有人检查public.video。很好,所以你已经硬编码了两种类型而不是一种。

但是不要问问"这是一部电影吗?"而不是硬编码您认为iOS将返回的特定类型?有办法做到这一点:

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

如果mediaType代表电影,则使用此方法,如果返回电影(无论返回哪种特定类型),isMovie应为YES,因为所有电影均符合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。您可以获得一个不太有用但更完整的列表,列出您的系统当前识别的所有UTI以及它们与shell的一致性:

/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 :(得分:2)

我会说第一种方法UTTypeEqual与第二种和第三种方法(NSString比较)之间的差异,是处理CFStringRefs或{{1}时的首选问题}。

第4种类型似乎是通过其实际字符串值引用NSStrings,您绝对不应该这样做,因为它是私有的并且实际上可能会更改。除此之外,它就像第二种和第三种方法一样。

看起来你可能想要检查几种类型,具体取决于你想要/需要的程度。

我可能会检查kUTTypeMovie

UTType Reference

的完整列表
kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4