ALAssetsLibrary 删除 ALAssetsGroup / ALAsset
Posted
技术标签:
【中文标题】ALAssetsLibrary 删除 ALAssetsGroup / ALAsset【英文标题】:ALAssetsLibrary delete ALAssetsGroup / ALAsset 【发布时间】:2012-06-18 18:29:54 【问题描述】:我使用 ios AssetsLibrary 从我的应用创建了“相册”。
阅读 ALAssetsLibrary、ALAssetsGroup 和 ALAsset 文档,我看到了“addAsset”、“addAssetsGroupAlbumWithName”的方法。
有没有办法以编程方式删除我的 ALAssetsGroup 和 ALAsset。 (属性“可编辑”假设为 TRUE,因为我创建了此数据)。
【问题讨论】:
你得到了正确的答案。为什么不接受呢? 【参考方案1】:您可以仅使用文档 API [ALAsset setImageData:metadata:completionBlock:] 删除 由您的应用创建的 ALAsset(但我还没有找到任何 API删除 ALAssetGroup)。
1)。将图像“photo.jpg”添加到您的项目中 2)。将图像保存到资源库:
ALAssetsLibrary *lib = [ALAssetsLibrary new];
UIImage *image = [UIImage imageNamed:@"photo.jpg"];
[lib writeImageToSavedPhotosAlbum:image.CGImage metadata:@ completionBlock:^(NSURL *assetURL, NSError *error)
NSLog(@"Write image %@ to asset library. (Error %@)", assetURL, error);
];
3)。转到默认图库,您会在“已保存的照片”相册中找到 photo.jpg。
4)。从资源库中删除此图片:
ALAssetsLibrary *lib = [ALAssetsLibrary new];
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop)
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
if(asset.isEditable)
[asset setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error)
NSLog(@"Asset url %@ should be deleted. (Error %@)", assetURL, error);
];
];
failureBlock:^(NSError *error)
];
5)。转到默认图库,您会发现 photo.jpg 已被删除。
【讨论】:
对我不起作用(iOS 7、Xcode 5)。我不断收到写入错误,当我在完成块中记录 URL 时,它为空。 (我确信我的资产是可编辑的,事实上,我已经复制粘贴了你的代码)。 嗨 Δ 开发者,您是否已将 photo.jpg 添加到您的项目中?如果不是 "writeImageToSavedPhotosAlbum:metadata:completionBlock:" 之前的图像对象应该是 nil,请检查,谢谢。 嗨,我正在使用以编程方式生成的图像,它不是零(我检查过) 请将您的代码 sn-p 粘贴到这里,谢谢,我会调查一下。 我的创建代码是你的,它有一个不为零的程序生成的图像(它可以工作,因为我可以在相册中看到图像)。我的删除代码正是你的,从这里复制粘贴。【参考方案2】:使用任何记录在案的 API 都无法做到这一点。只有照片应用可以删除相册。如果您希望将此功能添加到 iOS,我会在https://feedbackassistant.apple.com/ 填写功能请求。
【讨论】:
【参考方案3】:在 ios8 中可以使用照片框架删除照片
请查看 Photos Framework 的文档
要删除资产,请参阅 PHAssetChangeRequest
+ (void)deleteAssets:(id<NSFastEnumeration>)assets
其中assets
是要删除的PHAsset
对象数组。
要删除集合,请参阅 PHAssetCollectionChangeRequest
+ (void)deleteAssetCollections:(id<NSFastEnumeration>)assetCollections
https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/index.html#//apple_ref/occ/clm/PHAssetChangeRequest/deleteAssets:
【讨论】:
您好,欢迎来到 Stack Overflow。请注意,虽然您的答案保留在这里,但链接可能会更改或不可用。请编辑您的帖子以包含链接内容的要点。 @Ted 你能提供一些关于如何调用它的示例代码吗?不清楚要导入什么以及如何调用【参考方案4】:正如 Ted 所说,现在可以在 iOS 8 中使用照片服务。其实挺干净的。您需要向照片库提交更改请求。这是一个例子。
[[phphotoLibrary sharedPhotoLibrary] performChanges:^
[PHAssetChangeRequest deleteAssets:arrayOfPHAssets];
completionHandler:^(BOOL success, NSError *error)
NSLog(@"Finished deleting asset. %@", (success ? @"Success." : error));
];
确保您已导入照片并获得用户授权。 (您可能已经展示了图像)
PHAssetchangeRequest - 删除资产 https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/index.html#//apple_ref/occ/clm/PHAssetChangeRequest/deleteAssets: PHPhotoLibrary 类 - 授权状态 https://developer.apple.com/library/ios/documentation/Photos/Reference/PHPhotoLibrary_Class/#//apple_ref/occ/clm/PHPhotoLibrary/authorizationStatus
【讨论】:
【参考方案5】:evanchin 是正确的。此外,如果您想在 Xamarin.iOS(又名 monotouch)中执行此操作:
var lib = new ALAssetsLibrary();
lib.Enumerate(ALAssetsGroupType.All, (ALAssetsGroup group, ref bool libStop) =>
if (group == null)
return;
group.Enumerate((ALAsset asset, int index, ref bool groupStop) =>
if (asset != null && asset.Editable)
asset.SetImageDataAsync(new NSData(IntPtr.Zero), new NSDictionary(IntPtr.Zero));
);
, error => );
此代码将删除您的应用添加到 ALAssetsLibrary 的所有图像。
【讨论】:
【参考方案6】:您只能使用记录在案的 API 删除库中的任何资产。
重写 [ALAsset isEditable] 函数:
@implementation ALAsset(DELETE)
-(BOOL)isEditable
return YES;
@end
就像 evanchin 说的,删除资产:
ALAssetsLibrary *lib = [ALAssetsLibrary new];
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
usingBlock:^(ALAssetsGroup *group, BOOL *stop)
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
if(asset.isEditable)
[asset setImageData:nil
metadata:nil
completionBlock:^(NSURL *assetURL, NSError *error)
NSLog(@"Asset url %@ should be deleted. (Error %@)", assetURL, error);
];
];
failureBlock:^(NSError *error)
];
【讨论】:
收到此错误:Asset url (null) should be deleted. (Error Error Domain=ALAssetsLibraryErrorDomain Code=-3301 "Write busy" UserInfo=0x17df6780 NSLocalizedRecoverySuggestion=Try to write again, NSLocalizedFailureReason=There was a problem writing this asset because the writing resources are busy., NSLocalizedDescription=Write busy, NSUnderlyingError=0x17d1cae0 "Write busy")
以上是关于ALAssetsLibrary 删除 ALAssetsGroup / ALAsset的主要内容,如果未能解决你的问题,请参考以下文章
使用 iOS ALAssetsLibrary 更新/删除照片?
iPhone ALAssetsLibrary 获取所有图像并进行编辑
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; - 错误