使用相机拍摄的UIImage,PHAssetChangeRequest失败了。

10
我正在开发一个iOS应用,遇到了实现摄像头视图控制器的问题。当按下按钮时,我有一个单例相机对象来管理AVFoundation方面的事情并捕获图像。如下所示,一旦从相机中捕获UIImage,我会传递一个使用它的完成块。以下第一个方法是当相机上的拍摄按钮被按下时触发的操作。首先,通过禁用预览层上的连接来暂停相机层,然后捕获图像。然后,相机对象捕获UIImage,此时我会将相机预览层从视图中删除,并在其位置添加一个带有捕获的图像的UIImageView子视图。
接下来,我想使用Photos框架将图像添加到我创建的相册中。我可以轻松创建相册,而且我已经验证了我在第二个方法中使用的PHAssetCollection对象是正确的。然而,由于某种原因,我无法将我捕获的UIImage添加到相册中。我尝试将我项目中的随机图像文件添加到相册中,操作成功完成。我还通过使用NSLog语句检查两种方法中的图像描述来验证正确的图像是否成功传递给addPhotoToSavedPhotos方法。这使我相信图像出了问题,但是imageView成功地显示它,所以我不确定可能是什么问题。如果有人有任何解决方案的想法,我将不胜感激。此外,第二个方法中error.localizedDescriptionNSLog语句输出"The operation couldn't be completed. (Cocoa error -1)."
- (IBAction)capturePhoto:(id)sender {

    [self pauseCameraLayer];
    [[eventCamera sharedInstance] captureStillUIImage:^(UIImage *image, NSError *error){

        if(error)
        {
            NSLog(@"error capturing photo");
        }
        else
        {
            NSLog(@"%@",image.debugDescription);
        }
        [_captureButton setHidden:YES];
        [_switchCameraButton setHidden:YES];
        UIImageView *preview=[[UIImageView alloc] initWithImage:image];
        [preview setAutoresizesSubviews:YES];
        [preview setContentMode:UIViewContentModeScaleAspectFit];
        [preview setTransform:CGAffineTransformMakeRotation(M_PI_2)];
        preview.frame=_imageView.bounds;
        [_imageView addSubview:preview];
        [self addPhotoToSavedPhotos:[image copy]];
        NSLog(@"1: %@",image.description);
    }];

-(void)addPhotoToSavedPhotos:(UIImage*)photo
{
    PHAssetCollection *myCollection=[self getAPPCollection];
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        //Perform changes to photo library

        PHAssetChangeRequest *req=[PHAssetChangeRequest creationRequestForAssetFromImage:photo];
        PHAssetCollectionChangeRequest *assetChangeRequest=[PHAssetCollectionChangeRequest changeRequestForAssetCollection:myCollection];
        [assetChangeRequest addAssets:[NSArray arrayWithObject:req.placeholderForCreatedAsset]];
        //[libReq addAssets:@[assetPlaceHolder]];

    }completionHandler:^(BOOL success, NSError *error){
        //Perform any necessary actions after adding the photo to the photo 
        //library
        if(!success)
        {
            NSLog(@"didn't succeed, error: %@",error.localizedDescription);
        }
    }];
}

你修复了吗? - kondratyevdev
请问您能告诉我们日志中打印了什么吗? - Marcio Romero Patrnogic
这里可能有一个错误,我猜是在 self addPhotoToSavedPhotos:[image copy]] 上。尝试在 -(void)addPhotoToSavedPhotos:(UIImage*)photo 函数中添加断点,并检查是否有照片传递到该函数中。 - Md. Ibrahim Hassan
2个回答

1

试试这样做: 这段代码会首先检查相册是否存在。

  #import <Photos/Photos.h>

    - (void)addPhotoToSavedPhotos:(UIImage *)image {
        NSString *albumName = @"NameOFTheAlbum";

        void (^saveBlock)(PHAssetCollection *assetCollection) = ^void(PHAssetCollection *assetCollection) {
            [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
                PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
                [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]];

            } completionHandler:^(BOOL success, NSError *error) {
                if (!success) {
                    NSLog(@"Error creating asset: %@", error);
                }
            }];
        };

        PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
        fetchOptions.predicate = [NSPredicate predicateWithFormat:@"localizedTitle = %@", albumName];
        PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
        if (fetchResult.count > 0) {
            saveBlock(fetchResult.firstObject);
        } else {
            __block PHObjectPlaceholder *albumPlaceholder;
            [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName];
                albumPlaceholder = changeRequest.placeholderForCreatedAssetCollection;

            } completionHandler:^(BOOL success, NSError *error) {
                if (success) {
                    PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumPlaceholder.localIdentifier] options:nil];
                    if (fetchResult.count > 0) {
                        saveBlock(fetchResult.firstObject);
                    }
                } else {
                    NSLog(@"Error creating album: %@", error);
                }
            }];
        }
    }

0

PHAssetChangeRequest会弹出一个权限对话框。UI必须始终在主线程中运行。

尝试将PHAssetChangeRequest移出回调函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接