ALAssetsLibrary удалить ALAssetsGroup / ALAsset

Я создал «альбом фотографий» из своего приложения, используя IOS AssetsLibrary.

Читая документацию ALAssetsLibrary, ALAssetsGroup и ALAsset, я видел методы «addAsset», «addAssetsGroupAlbumWithName».

Есть ли способ удалить ПРОГРАММНО мои ALAssetsGroup и ALAsset. (свойство «редактируемое» должно быть ИСТИНА, потому что я создаю эти данные).


person user1226119    schedule 15.06.2012    source источник
comment
Вам дали правильный ответ. Почему бы не принять это?   -  person matt    schedule 02.12.2012


Ответы (6)


Это невозможно с использованием любого документированного API. Только приложение для фотографий может удалять альбомы. Если вы хотите, чтобы эта функция была добавлена ​​в iOS, я бы заполнил запрос на функцию по адресу https://feedbackassistant.apple.com. /.

person holtmann    schedule 15.06.2012

Вы можете только удалить ALAsset, который создан вашим приложением с помощью API документа [ALAsset setImageData:metadata:completionBlock:] (но я не нашел никакого 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 уже удален.

person evanchin    schedule 29.11.2013
comment
У меня не работает (iOS 7, Xcode 5). Я продолжаю получать ошибку записи, и когда я регистрирую URL-адрес в блоке завершения, он равен нулю. (Я уверен, что мой ассет доступен для редактирования, на самом деле я скопировал ваш код). - person Garoal; 26.01.2014
comment
Привет, разработчик Δ, вы добавили photo.jpg в свой проект? Если объект изображения перед writeImageToSavedPhotosAlbum:metadata:completionBlock: не должен быть равен нулю, проверьте, спасибо. - person evanchin; 29.01.2014
comment
Привет, я делаю это с программно сгенерированным изображением, которое не равно нулю (я проверил это) - person Garoal; 29.01.2014
comment
Пожалуйста, вставьте сюда фрагмент кода, спасибо, я посмотрю. - person evanchin; 09.02.2014
comment
Мой код создания принадлежит вам с программно сгенерированным изображением, которое не является нулевым (и оно работает, потому что я вижу изображение в фотоальбоме). Мой код удаления точно ваш, скопирован отсюда. - person Garoal; 09.02.2014
comment
Извините, я попробовал ваш сценарий, но он работает как на iOS 6, так и на 7. Я просто программно генерирую изображение и сохраняю его в галерее по умолчанию с помощью кода выше, изображение можно найти в галерее по умолчанию, затем я использую удаление с помощью [ALAsset setImageData: nil metadata:nil completeBlock:...], изображение удаляется из галереи по умолчанию, как и ожидалось. - person evanchin; 12.02.2014
comment
Я также не могу заставить это работать (iOS7) со следующей ошибкой: (Error Error Domain=ALAssetsLibraryErrorDomain Code=-3300 "Write failed" UserInfo=0xd42d420 {NSLocalizedDescription=Write failed, NSUnderlyingError=0xd435ff0 "Write failed", NSLocalizedFailureReason=There was a problem writing this asset because the write failed.}) Если я предоставлю новое изображение (как NSData), оно отлично работает, хотя для замены, но я не могу удалить - person Shizam; 30.04.2014
comment
Для меня удаление постоянно терпит неудачу в симуляторе, но на самом деле работает на устройстве. - person Christopher Lenz; 13.05.2014
comment
Отлично работает на iOS 7. Это должен быть выбранный ответ. - person craftsman; 18.07.2014

в ios8 удаление фотографий возможно с помощью Photos Framework

Пожалуйста, ознакомьтесь с документацией 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:

person Ted    schedule 23.06.2014
comment
Привет и добро пожаловать в Stack Overflow. Обратите внимание, что пока ваш ответ остается здесь, ссылка может измениться или стать недоступной. Пожалуйста, отредактируйте свое сообщение, чтобы оно содержало основное содержание ссылки. - person Noich; 23.06.2014
comment
@Ted Можете ли вы предоставить пример кода, как его вызвать? Не понятно, что импортировать и как вызывать - person Dinesh; 16.10.2014

Как сказал Тед, теперь это возможно в iOS 8 с помощью сервиса Photos. На самом деле довольно чисто. Вам необходимо отправить запрос на изменение в фотобиблиотеку. Вот пример.

[[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 - AuthorizationStatus https://developer.apple.com/library/ios/documentation/Photos/Reference/PHPhotoLibrary_Class/#//apple_ref/occ/clm/PHPhotoLibrary/authorizationStatus

person Matt Reed    schedule 19.01.2015

еванчин прав. Более того, если вы хотите сделать это в 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.

person Kraig McConaghy    schedule 27.04.2014

Вы можете удалить любой ресурс в библиотеке, используя ТОЛЬКО документированный API.

  1. перезапись функции [ALAsset isEditable]:

    @implementation ALAsset(DELETE)
    -(BOOL)isEditable{
        return YES;
    }
    @end
    
  2. как сказал эванчин, удалите актив:

    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) {
    
     }];
    
person Feng    schedule 14.05.2014
comment
получая эту ошибку: 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"}) - person Mrugesh Tank; 05.05.2015