2013-12-01 4 views
0

Я отправляю этот вопрос как продолжение следующей темы, которую я опубликовал ранее.Сохранение и загрузка изображений с использованием ALAssetLibrary

Я собираю изображение и видео в приложении ios и сохраняю его в рулоне камеры (требование клиента). Тем не менее, чтобы просмотреть захваченные изображения/видео, я сохраняю значение assetURL в основных данных как String.

Моя экономия код выглядит следующим образом:

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

    UIImage *cameraMedia = [info objectForKey:UIImagePickerControllerOriginalImage ]; 
    NSDictionary* metaData = [info objectForKey:UIImagePickerControllerMediaMetadata]; 

    NSString* mediaType = [info objectForKey: UIImagePickerControllerMediaType]; 
    NSURL* mediaUrl = (NSURL*)[info valueForKey:UIImagePickerControllerMediaURL]; 

    ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init]; 

    //For now we are saving image capture time from here 
    //In future we may need to load the time from image metaData 
    NSDate *captureTime = [[NSDate alloc] init]; 

    //completion blocks 
    ALAssetsLibraryWriteImageCompletionBlock imageCompletionBlock = ^(NSURL* imgURL, NSError* error){ 
    if (error == nil) { 
     NSLog(@"Asset URL %@", imgURL); 
     [self saveEvidence:imgURL mediaType:mediaType withDate:captureTime]; 

     } else { 
      UIAlertView *alertView = 
     [[UIAlertView alloc] initWithTitle:@"Failed to save image to device!" 
            message:[error localizedDescription] 
            delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:Nil]; 
     [alertView show]; 
    } 

}; 

ALAssetsLibraryWriteVideoCompletionBlock videoCompletionBlock = ^(NSURL* videoURL, NSError* error){ 
    if(error == nil) 
    { 
     NSLog(@"Asset URL %@", videoURL); 
     [self saveEvidence:videoURL mediaType:mediaType withDate:captureTime]; 
    }else 
    { 
     UIAlertView *alertView = 
     [[UIAlertView alloc] initWithTitle:@"Failed to save video to device!" 
            message:[error localizedDescription] 
            delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:Nil]; 
     [alertView show]; 
    } 

}; 


    if(CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo){ 
     [al writeImageToSavedPhotosAlbum:[cameraMedia CGImage] metadata:metaData completionBlock: imageCompletionBlock]; 

    }else if(CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie , 0) == kCFCompareEqualTo){ 
     [al writeVideoAtPathToSavedPhotosAlbum:mediaUrl completionBlock:videoCompletionBlock]; 

    } 

     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 

В saveEvidence, я сохранение URL в моей основной сущности данных. Теперь я загрузке мой образ следующим образом:

-(void)loadThumbNail:(NSString*) mediaURL{ 

NSLog(@"image URL String: %@", mediaURL); 

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) 
{ 
    NSLog(@"in result block"); 
    //self.thumbNailImage = [UIImage imageWithCGImage:[asset thumbnail]]; 

    ALAssetRepresentation *rep = [asset defaultRepresentation]; 
    CGImageRef iref = [rep fullResolutionImage]; 
    if (iref) { 
     self.thumbNailImage = [UIImage imageWithCGImage:iref]; 
    } 
}; 

// 
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error) 
{ 
    NSLog(@"Cant load image - %@",[error localizedDescription]); 
}; 

if(mediaURL && [mediaURL length]) 
{ 
    self.thumbNailImage = nil; 

    NSURL *asseturl = [NSURL URLWithString:mediaURL]; 
    NSLog(@"image URL: %@", asseturl); 

    ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init]; 

    [assetslibrary assetForURL:asseturl 
        resultBlock:resultblock 
        failureBlock:failureblock]; 
    } 

} 

Сначала я пытался загрузить миниатюрное изображение с помощью: self.thumbNailImage = [UIImage imageWithCGImage: [эскиз активов]]; Но изображение остается нулевым, то есть не загружается. Затем я попробовал загрузить fullResolutionImage. Тем не менее, изображение равно нулю.

Любое решение?

+0

, если вы по-прежнему сталкивается с какой-либо проблемой, пожалуйста, обновите здесь ... –

+0

Я думаю, что мой метод работает. Возможно, проблема связана с загрузкой асинхронного изображения. Я получаю ненулевое изображение ref в блоке результата, но в cellForItemAtIndexPath, при загрузке изображения в виде изображения ячейки я получаю нуль. Вот мой заказ звонка, [self loadThumbNail: evidence.url]; [cell.imageThumNailView setImage: self.thumbNailImage]; После некоторого дальнейшего исследования я обнаружил, что назначение изображения в ячейку вызывает вызов перед вызовом загрузки изображения. – Pixelord

ответ

0

Попробуйте принести активы как этот

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
[group enumerateAssetsUsingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) 
    { 
     if (alAsset) 
     { 
      ALAssetRepresentation *representation =[alAsset defaultRepresentation]; 
      NSURL *url = [representation url]; 

      if([url isEqualToString:YOUR_SAVED_URL]) 
      { 
      NSString *assetType=[alAsset valueForProperty:ALAssetPropertyType]; 
      UIImage *thumbNailImage=[UIImage imageWithCGImage:alAsset.thumbnail]; 
      } 
     } 
    }]; 
if(group==nil) 
{ 
    // do what ever if group getting null 
} 
} failureBlock: ^(NSError *error) 
{ 
// may be photo privacy setting disabled 
} 
]; 
+0

Я предполагаю, что ваш метод будет извлекать все изображения из рулона камеры. Но мне нужно получить только фотографии, снятые из приложения. Следовательно, я сохраняю URL в своих основных данных. – Pixelord

+0

, тогда вам нужно сравнить все сохраненные URL-адреса с текущими активами. Проверка URL обновила Ans. –

Смежные вопросы