【问题标题】:ALAssetsLibrary delete ALAssetsGroup / ALAssetALAssetsLibrary 删除 ALAssetsGroup / ALAsset
【发布时间】:2012-06-18 18:29:54
【问题描述】:

我使用 IOS AssetsLibrary 从我的应用创建了“相册”。

阅读 ALAssetsLibrary、ALAssetsGroup 和 ALAsset 文档,我看到了“addAsset”、“addAssetsGroupAlbumWithName”的方法。

有没有办法以编程方式删除我的 ALAssetsGroup 和 ALAsset。 (属性“可编辑”假设为 TRUE,因为我创建了此数据)。

【问题讨论】:

  • 你得到了正确的答案。为什么不接受呢?

标签: ios5 alassetslibrary assets alasset assetslibrary


【解决方案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 删除库中的任何资产。

        1. 重写 [ALAsset isEditable] 函数:

          @implementation ALAsset(DELETE)
          -(BOOL)isEditable{
              return YES;
          }
          @end
          
        2. 就像 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"})
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        相关资源
        最近更新 更多