2013-04-30 13 views
5

Sto cercando di ottenere alcuni dati su un video che ho scelto nello UIImagePicker.UIImagePickerControllerReferenceURL mancante

Quindi, quando entra nel metodo delegato UIImagePicker (sotto), capisco che ho bisogno di usare la chiave UIImagePickerControllerReferenceURL dal dizionario delle informazioni.

-(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]); 
     } 
    }]; 
} 

Il problema è che l'url è risultante con zero. Ho stampato la descrizione di informazioni e sembra che questo:

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"; 
} 

dopo che ho fatto qualche ricerca ho scoperto che se ho impostato la macchina fotografica con kUTTypeMovie mi dovrebbe dare sia i media e di riferimento url.

è così che ho definito la mia macchina fotografica:

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]; 

C'è qualcosa che mi manca?

Grazie,

risposta

11

Quasi andato folle su questo. Ogni dove guardavo sembrava che tutti fossero convinti che lo UIImagePickerControllerReferenceURL fosse sempre lì.

In ogni caso il problema è che se il tuo delegato viene chiamato dopo aver scattato una foto utilizzando la fotocamera, l'oggetto UIImagePickerControllerReferenceURL non sarà lì poiché l'immagine non è stata ancora salvata nel rullino della fotocamera, quindi non c'è UIImagePickerControllerReferenceURL . È presente solo quando il delegato viene chiamato dopo aver selezionato un'immagine dal rullino fotografico.

Quindi, per ovviare a questo, è necessario utilizzare ALAssetLibrary per salvarlo nel rullino della telecamera, quindi rileggere l'URL.

Heres la mia soluzione:

primo luogo si vuole rilevare il PickerController sourceType per vedere se era la macchina fotografica o photosLibrary/savedPhotosAlbum. Se è la fotocamera, usiamo la libreria di asset writeImageToSavedPhotosAlbum: orientation: completionBlock: per scrivere l'immagine sul rullino fotografico e restituirci l'URL delle immagini nel blocco di completamento.

Tuttavia, se la sua non è la fotocamera allora che il mezzo è stato sia il photosLibrary o savedPhotosAlbum che in entrambi i casi [info objectForKey:UIImagePickerControllerReferenceURL] sarebbe restituire un URL valido

- (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]]; 
} 

}

Speranza che aiuta.

+0

sto ottenendo un errore in questa affermazione: ALAssetsLibrary * biblioteca = [Utils defaultAssetsLibrary]; (Uso dell'identificatore dell'identificatore non dichiarato) Cosa mi manca qui? –

+0

@AzeemShaikh Mi dispiace che è stata colpa mia, ho una chiamata di utilità che crea un singleton di ALAssetsLibrary come è la migliore pratica per avere solo uno di questi nella tua app. Ci sono alcuni articoli, post di stack e documentazione Apple online che lo spiegano.Quindi è sufficiente sostituire [Utils defaultAssetsLibrary] con una nuova istanza di ALAssetsLibrary. Comunque come ho detto è meglio che tu abbia un singleton di questo nella tua app. – ssh88