使用 ALAssetLibrary 保存到相册时失败

Posted

技术标签:

【中文标题】使用 ALAssetLibrary 保存到相册时失败【英文标题】:Failure when saving to album using ALAssetLibrary 【发布时间】:2015-09-10 13:49:53 【问题描述】:

我正在尝试使用 Marin Todorov 的 ALAssetsLibrary+CustomPhotoAlbum 将我生成的一些图像保存到使用 ALAssetLibrary 的相册中。但是,我大部分时间都会遇到随机故障。

  // Get the asset library instance.
  ALAssetsLibrary *library = [ALAssetLibraryManager defaultAssetsLibrary];
  [self.imageModels enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    // Sidenote: Trying to use an image that I have locally in my image assets fails as well.
    // UIImage *image = [UIImage imageNamed:@"Background-light-png.png"];
    UIImage *image = [UIImage imageWithContentsOfFile:[obj valueForKey:@"imagePath"]];
    [_imagesToShare addObject:image];
    if (image)
        [library saveImage:image toAlbum:@"My Album" completion:^(NSURL assetURL, NSError error) 
            NSLog(@"Success");
         failure:^(NSError *error) 
            NSLog(@"Failed %@", error.description);
        ];
    
];

在故障块中,如果我添加以下代码,我可以看到图像已保存到相机胶卷中。

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

我得到的错误是

Failed: Error Domain=LIB_ALAssetsLibrary_CustomPhotoAlbum Code=0 "ALAssetsGroup failed to add asset." UserInfo=0x171277c80 NSLocalizedDescription=ALAssetsGroup failed to add asset.

获取资源库的代码

+ (ALAssetsLibrary *)defaultAssetsLibrary 
   static dispatch_once_t pred = 0;
   static ALAssetsLibrary *library = nil;
   dispatch_once(&pred, ^
        library = [[ALAssetsLibrary alloc] init];
   );
   return library;

我搜索了很多,但在这个主题上找不到太多。我的方法是通过单击按钮调用的,并且不应同时发生其他写入。我在网上找到的唯一信息是您应该保留相同的 ALAssetLibrary 实例,我使用单例类完成了这一点。

【问题讨论】:

【参考方案1】:

这是我使用资源库保存图片的方式:

 ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:((UIImage *)[info objectForKey:UIImagePickerControllerEditedImage]).CGImage
                             metadata:[info objectForKey:UIImagePickerControllerMediaMetadata]
                      completionBlock:^(NSURL *assetURL, NSError *error) 
                          NSLog(@"assetURL %@", assetURL);
                            imageURL=[assetURL absoluteString];

                          [[NSUserDefaults standardUserDefaults] setObject:imageURL forKey:@"imageurl"]; //for reference of the path

                      ];

【讨论】:

以上是关于使用 ALAssetLibrary 保存到相册时失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将视频保存到具有特定名称的相册

ios 8,如何使用 ALAssetLibrary 获取所有照片来替换丢失的相机胶卷相册

如何在保存之前检查文件(视频)是不是已经在 ALAssetsLibrary(相册)中?

iphone iOS 内存导航控制器和 ALAssetlibrary 的警告句柄

如何获取相册中图像的图像文件名和标签?

iOS系统相册的有关操作