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的主要内容,如果未能解决你的问题,请参考以下文章

如何将视频保存到相机胶卷并获取资产 URL?

使用 iOS ALAssetsLibrary 更新/删除照片?

iPhone ALAssetsLibrary 获取所有图像并进行编辑

IOS无法创建与已删除专辑同名的专辑?

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; - 错误

ALAssetsLibrary 获取相机胶卷