2013-03-25 14 views
6

Ich habe verschiedene Methoden zur Überprüfung, ob der zurückgegebene Medientyp in -imagePickerController:didFinishPickingMediaWithInfo: ist Video gesehen. Zum Beispiel meine Art und Weise:Ermitteln, ob der Bildauswahl-Medientyp Video ist

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

oder

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

oder

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

oder

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

oder

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

Jeder scheint einen anderen Weg zu haben, dies zu tun. Was ist die empfohlene Methode zum Überprüfen des Medientyps? Vorzugsweise mit einer Möglichkeit, "alle Bildtypen" oder "alle Videotypen" einzuschließen.

Antwort

2

Ich würde sagen, dass die Differenz zwischen der ersten Methode UTTypeEqual und den zweiten und dritten Verfahren (NSString Vergleich), eine Frage der Bevorzugung ist mit CFStringRefs oder NSStrings im Umgang.

Der vierte Typ scheint kUTTypeMovie durch seinen tatsächlichen Zeichenfolgenwert zu referenzieren, den Sie absolut nicht tun sollten, da es privat ist und sich tatsächlich ändern kann. Abgesehen davon ist es genauso wie die zweite und dritte Methode.

Es sieht so aus, als ob Sie wahrscheinlich gegen ein paar mehr Typen überprüfen möchten, je nachdem, wie gründlich Sie sein wollen/müssen.

Ich würde wahrscheinlich für kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4 überprüfen.

Liste von 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

Es wäre besser, statt für Konformität mit einem bestimmten UTI zu überprüfen.

Gerade jetzt, iOS sagt Ihnen, es ist ein public.movie, aber was wird es nächstes Jahr sagen? Sie werden sehen, dass Leute auch nach public.video suchen. Großartig, also haben Sie zwei Typen fest programmiert statt einer.

Aber wäre es nicht besser zu fragen "Ist das ein Film?" anstatt den konkreten Typ, den Sie glauben, dass iOS zurückgeben wird, zu programmieren? Es gibt einen Weg zu tun, dass:

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

Mit diesem Ansatz sollte isMovieYES sein, wenn ein Film zurückgegeben wird (unabhängig davon, welche spezifische Art zurückgegeben wird), wenn media einen Film darstellt, da alle Filme von kUTTypeMovie entsprechen. Um wirklich klar zu sein, wenn es ein kUTTypeVideo ist, wird dies auch als ein Film erkennen, weil kUTTypeVideokUTTypeMovie konform ist.

Ebenso können Sie überprüfen, um zu sehen, ob das, was ein Bild zurückgegeben wird:

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

isIamgeYES sein soll, wenn ein Bild zurückgegeben wird, da alle Bilder zu kUTTypeImage entsprechen.

Siehe Apples (teilweise) Typenbaum hier: Uniform Type Identifiers Are Declared in a Conformance Hierarchy. Sie können zur Zeit von Ihrem System und deren Konformität von der Schale mit anerkannten weniger nützlich, aber vollständige Liste aller Harnwegsinfekte erhalten:

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

Insbesondere können Sie sehen, public.video wie folgt definiert ist:

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

Beachten Sie, dass UTTypeConformsTotrue zurückgibt, wenn die Typen identisch sind. Aus der Apple-Dokumentation:

Gibt True zurück, wenn der einheitliche Typbezeichner dem zweiten Typ entspricht oder diesem entspricht.

+1

Ich bin mir nicht sicher, wie das hier ohne irgendwelche Stimmen seit so lange saß. Dies ist der beste Ansatz, den ich auf SO gesehen habe. – Toby

+0

Ich mag Ihren Ansatz auch. Vielen Dank für diese Lösung. – iWheelBuy

+0

Sobald Sie über diese APIs stolpern, ist es wirklich das einzige, das überhaupt Sinn macht. :) –

Verwandte Themen