2013-04-30 97 views
5

我想要獲得一些關於我在UIImagePicker中選擇的視頻的數據。UIImagePickerControllerReferenceURL丟失

因此,當它進入UIImagePicker委託方法(下面)我明白我需要使用信息字典中的UIImagePickerControllerReferenceURL鍵。

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

問題是url是由nil產生的。 我打印信息的描述,它看起來像這樣:

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

我做了一些研究,我發現,如果我kUTTypeMovie設置相機就應該給我媒體和參考網址後。

這是我如何定義我的相機:

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

有我丟失的東西?

謝謝,

回答

11

幾乎在這一個瘋了。每個我看起來每個人都似乎相信UIImagePickerControllerReferenceURL總是在那裏。

無論如何,問題是,如果您的代表在您使用相機拍攝照片後比UIImagePickerControllerReferenceURL物體不會出現,因爲圖像尚未保存到相機膠捲,因此沒有UIImagePickerControllerReferenceURL 。只有在從相機膠捲選擇圖像後調用代表時纔會出現。

所以我的解決方法是使用ALAssetLibrary將它保存到相機膠捲然後回讀URL。

繼承人我的解決方案:

首先要檢測你的PickerController sourceType的,看它是否是相機或photosLibrary/savedPhotosAlbum。如果是相機,那麼我們使用資源庫的writeImageToSavedPhotosAlbum:orientation:completionBlock:將圖像寫入相機膠捲,並將完成塊中的圖像URL返回給我們。

但是,如果它不是那麼相機這意味着要麼在photosLibrarysavedPhotosAlbum這兩種情況下[info objectForKey:UIImagePickerControllerReferenceURL]會返回一個有效的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]]; 
} 

}

希望有所幫助。

+0

,我得到一個錯誤,在此聲明:ALAssetsLibrary *庫= [utils的defaultAssetsLibrary] (使用未聲明的標識符Utils)我在這裏錯過了什麼? – 2014-07-21 19:28:04

+0

@AzeemShaikh對不起,這是我的錯,我有一個utils調用,創建ALAssetsLibrary的單例,最好的做法是隻在你的應用中使用其中的一個。有幾篇文章,堆棧帖子和Apple在線文檔解釋了這一點。因此,您只需將[Utils defaultAssetsLibrary]替換爲ALAssetsLibrary的新實例即可。然而就像我說的最好的,你有你的應用程序中的單例。 – ssh88 2014-08-11 10:16:23