2013-03-25 27 views
6

Tôi đã thấy các phương pháp khác nhau để kiểm tra xem loại phương tiện được trả lại trong -imagePickerController:didFinishPickingMediaWithInfo: là video hay không. Ví dụ, cách của tôi:Xác định xem loại phương tiện của trình chọn hình ảnh có là video

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

hoặc

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

hoặc

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

hoặc

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

hoặc

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

Mọi người dường như có cách khác để thực hiện việc này. Phương pháp được đề nghị để kiểm tra loại phương tiện là gì? Tốt nhất là có cách bao gồm "tất cả các loại hình ảnh" hoặc "tất cả các loại video".

Trả lời

2

Tôi sẽ nói sự khác biệt giữa phương pháp đầu tiên UTTypeEqual và phương pháp thứ hai và thứ ba (NSString so sánh), là một vấn đề ưu tiên trong giao dịch với CFStringRefs hoặc NSStrings.

Loại thứ tư có vẻ là tham chiếu kUTTypeMovie bởi giá trị chuỗi thực tế mà bạn hoàn toàn không nên làm vì nó là riêng tư và thực sự có thể thay đổi. Bên cạnh đó nó cũng giống như phương pháp thứ hai và thứ ba.

Có vẻ như bạn có thể muốn kiểm tra thêm một vài loại tùy thuộc vào mức độ bạn muốn/cần đến.

Tôi có thể sẽ kiểm tra kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4.

Danh mục đầy đủ từ 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

Sẽ tốt hơn để kiểm tra sự phù hợp với một nhiễm trùng đường niệu đặc biệt để thay thế.

Ngay bây giờ, iOS sẽ cho bạn biết số public.movie, nhưng sẽ nói gì vào năm tới? Bạn cũng sẽ thấy mọi người kiểm tra số public.video. Tuyệt vời, vì vậy bạn đã mã hóa cứng hai loại thay vì một.

Nhưng sẽ không tốt hơn nếu bạn hỏi "Đây có phải là phim không?" thay vì mã cứng loại cụ thể mà bạn nghĩ rằng iOS sẽ trở lại? Có một cách để làm điều đó:

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

Sử dụng phương pháp này, isMovie nên YES nếu một bộ phim được trả lại (không phân biệt loại hình cụ thể được trả lại) nếu MediaType đại diện cho một bộ phim, vì tất cả các bộ phim phù hợp với từ kUTTypeMovie. Để thực sự rõ ràng, nếu đó là kUTTypeVideo, điều này cũng sẽ nhận ra nó là một bộ phim, vì kUTTypeVideo tuân theo kUTTypeMovie.

Tương tự như vậy, bạn có thể kiểm tra để xem nếu điều trở lại là một hình ảnh:

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

isIamge nên YES nếu một hình ảnh được trả về, vì tất cả những hình ảnh phù hợp với kUTTypeImage.

Xem cây loại (một phần) của Apple tại đây: Uniform Type Identifiers Are Declared in a Conformance Hierarchy. Bạn có thể nhận được một danh sách ít hữu ích nhưng hoàn chỉnh hơn về tất cả UTIs hiện được công nhận bởi hệ thống của bạn và sự phù hợp của họ từ vỏ với:

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

Đặc biệt, bạn có thể thấy public.video được định nghĩa như thế này:

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

Lưu ý rằng UTTypeConformsTo trả về true nếu các loại này giống nhau. Từ tài liệu của Apple:

Trả về true nếu định danh loại đồng nhất bằng hoặc phù hợp với loại thứ hai.

+1

Bạn không chắc chắn cách thức này ngồi ở đây mà không có bất kỳ phiếu bầu nào trong thời gian dài. Đây là cách tiếp cận tốt nhất mà tôi đã thấy trên SO. – Toby

+0

Tôi thích cách tiếp cận của bạn. Thx rất nhiều cho giải pháp này. – iWheelBuy

+0

Một khi bạn vấp ngã trên các API này, nó thực sự là người duy nhất có ý nghĩa gì cả. :) –

Các vấn đề liên quan