2013-04-30 6 views
5

Próbuję uzyskać dane o filmie, które wybrałem w UIImagePicker.UIImagePickerControllerReferenceURL brakuje

Kiedy wchodzimy do metody delegatów UIImagePicker (poniżej), rozumiem, że muszę używać klucza UIImagePickerControllerReferenceURL ze słownika informacji.

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL]; 

    NSLog(@"%@",url); 

    [library addAssetURL:[info objectForKey:UIImagePickerControllerReferenceURL] toAlbum:@"Compedia" withCompletionBlock:^(NSError *error) { 
     if (error!=nil) { 
      NSLog(@"Big error: %@", [error description]); 
     } 
    }]; 
} 

Problem polega na tym, że adres URL jest wynikiem zer. wydrukowałem opis informacji i wygląda to tak:

Printing description of info: 
{ 
    UIImagePickerControllerMediaType = "public.movie"; 
    UIImagePickerControllerMediaURL = "file://localhost/private/var/mobile/Applications/6630FBD3-1212-4ED0-BC3B-0C23AEEFB267/tmp/capture-T0x1f57e880.tmp.Ulfn5o/capturedvideo.MOV"; 
} 

Po Robiłem rozeznanie I okazało się, że jeśli ustawić aparat kUTTypeMovie powinno dać mi zarówno mediów i Przekierowanie.

tak właśnie definiuje mój aparat:

cameraUI = [[UIImagePickerController alloc] init]; 
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; 
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]; 
cameraUI.allowsEditing = YES; 
cameraUI.delegate = delegate; 
cameraUI.showsCameraControls = NO; 
cameraUI.cameraOverlayView = [self getCustomToolBar]; 

Czy coś mi brakuje?

Dzięki,

Odpowiedz

11

Prawie oszalał na tym. Wszystko, na co wyglądałem, wydawało się być przekonane, że UIImagePickerControllerReferenceURL zawsze tam jest.

W każdym razie problem polega na tym, że jeśli Twój uczestnik jest wywoływany po zrobieniu zdjęcia za pomocą kamery, obiekt nie będzie widoczny, ponieważ obraz nie został zapisany na rolce aparatu, a więc nie ma żadnego UIImagePickerControllerReferenceURL . Jest tylko wtedy, gdy delegat jest wywoływany po wybraniu obrazu z rolki aparatu.

Moim rozwiązaniem jest użycie ALAssetLibrary do zapisania go w rolce aparatu, a następnie odczytanie adresu URL.

Herezje moim roztwór:

Pierwszy chcesz wykryć PickerController sourceType, aby zobaczyć, czy to aparat lub photosLibrary/savedPhotosAlbum. Jeśli jest to kamera, wówczas używamy biblioteki writeImageToSavedPhotosAlbum biblioteki zasobów: orientation: completionBlock: aby zapisać obraz na rolce aparatu i przywrócić adres URL obrazów w bloku zakończenia.

Jednak jeśli jej nie aparat wtedy oznacza to, że był albo photosLibrary lub savedPhotosAlbum co w obu przypadkach [info objectForKey:UIImagePickerControllerReferenceURL] zwróci prawidłowy adres URL

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 

//dismiss the imagepicker view 
[self dismissViewControllerAnimated:YES completion:nil]; 


if([picker sourceType] == UIImagePickerControllerSourceTypeCamera) 
{ 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    ALAssetsLibrary *library = [Utils defaultAssetsLibrary]; 
    [library writeImageToSavedPhotosAlbum:image.CGImage orientation:(ALAssetOrientation)image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) 
    { 
     //here is your URL : assetURL 
    }]; 
} 
else 
{ 
    //else this is valid : [info objectForKey:UIImagePickerControllerReferenceURL]]; 
} 

}

nadzieję, że pomoże.

+0

Dostaję błąd w tym stwierdzeniem: ALAssetsLibrary * biblioteka = [Utils defaultAssetsLibrary]; (Używanie niezadeklarowanego identyfikatora Utils) Czego tu mi brakuje? –

+0

@AzeemShaikh Przepraszamy, to była moja wina, mam wywołania utils, które tworzą singlet ALAssetsLibrary, ponieważ najlepszą praktyką jest posiadanie tylko jednego z nich w swojej aplikacji. Istnieje kilka artykułów, posty stosu i dokumentacja Apple online wyjaśniając to.Musisz tylko zastąpić [Utils defaultAssetsLibrary] nową instancją ALAssetsLibrary. Jednak jak powiedziałem, co najlepsze, że masz singleton tego w swojej aplikacji. – ssh88