2012-06-15 3 views
6

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

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

Есть ли способ удалить PROGRAMMATICALL my ALAssetsGroup и ALAsset. (свойство 'editable' должно быть TRUE, потому что я создаю эти данные).

+0

Вы получили правильный ответ. Почему бы не принять это? – matt

ответ

10

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

+0

спасибо за ваш ответ, я позволю запрос функции :) – user1226119

14

Вы можете только удалить ALAsset, который создан приложение с документом API [ALAsset setImageData: метаданные: 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). Перейдите в галерею по умолчанию, вы найдете фото.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 уже удален.

+0

Не работает для меня (iOS 7, Xcode 5). Я продолжаю получать ошибку при записи, и когда я регистрирую URL-адрес в блоке завершения, он равен нулю. (Я уверен, что мой актив доступен для редактирования, на самом деле я копировал ваш код). – Garoal

+0

Привет, разработчик, вы добавили photo.jpg в свой проект? Если объект изображения до «writeImageToSavedPhotosAlbum: metadata: completionBlock:» должен быть равен нулю, пожалуйста, проверьте, спасибо. – evanchin

+0

Привет, я делаю это с программно сгенерированным изображением, которое не ноль (я проверил это) – Garoal

2

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.

1

Вы можете удалить любые активы в библиотеке, используя ТОЛЬКО с документально подтвержденным 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) { 
    
    }]; 
    
+0

получение этой ошибки: 'Asset url (null) следует удалить. (Error Error Domain = ALAssetsLibraryErrorDomain Code = -3301 «Write busy» UserInfo = 0x17df6780 {NSLocalizedRecoverySuggestion = Попробуйте снова написать NSLocalizedFailureReason = Не удалось написать этот ресурс, потому что ресурсы записи заняты. NSLocalizedDescription = Write busy, NSUnderlyingError = 0x17d1cae0 «Write busy»}) ' –

7

в ios8 удаления фотографий может быть возможно с помощью Рамки фотографий

Пожалуйста, проверьте документацию Фотографии 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:

+0

Привет и приветствуем переполнение стека. Обратите внимание, что пока ваш ответ остается здесь, ссылка может измениться или стать недоступной. Пожалуйста, отредактируйте свое сообщение, чтобы он содержал основные сведения о содержании ссылки. – Noich

+0

подробности добавлены, спасибо Noich! – Ted

+0

@Ted Можете ли вы предоставить пример кода, как его назвать? Не понятно, что импортировать и как звонить – Dinesh

3

Как сказал Тед, теперь это возможно в прошивке 8 с использованием фотографий службы. На самом деле это довольно чисто. Вам необходимо отправить запрос на изменение в фотобиблиотеку. Вот пример.

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
    [PHAssetChangeRequest deleteAssets:arrayOfPHAssets]; 
} completionHandler:^(BOOL success, NSError *error) { 
    NSLog(@"Finished deleting asset. %@", (success ? @"Success." : error)); 
}]; 

Убедитесь, что вы импортировали фотографии и получили авторизацию от пользователя. (Что вы, вероятно, сделал, чтобы показать изображение уже)

PHAssetchangeRequest - deleteAssets 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

Смежные вопросы