2012-06-15 18 views
6

He creado "photos album" desde mi aplicación, utilizando IOS AssetsLibrary.ALAssetsLibrary delete ALAssetsGroup/ALAsset

Lectura ALAssetsLibrary, ALAssetsGroup y ALAsset documentations, he visto métodos para "addAsset", "addAssetsGroupAlbumWithName".

Hay una manera de eliminar PROGRAMMATICALLY mi ALAssetsGroup y ALAsset. (la propiedad 'editable' supone que es VERDADERO porque creo estos datos).

+0

Se te dio la respuesta correcta. ¿Por qué no aceptarlo? – matt

Respuesta

10

Esto no es posible con ninguna API documentada. Solo la aplicación de fotos puede eliminar álbumes. Si desea que esta característica se agregue a iOS, llenaría una solicitud de función al http://radar.apple.com.

+0

gracias por su respuesta, voy a dejar una solicitud de función :) – user1226119

14

Puede única eliminar la ALAsset que es creado por la aplicación con el documento API [ALAsset setImageData: metadatos: completionBlock:] (Pero no he encontrado ninguna API para eliminar una ALAssetGroup).

1). Agregue una imagen "photo.jpg" a su proyecto 2). Guarde una imagen en la biblioteca de activos:

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). Vaya a la galería predeterminada, encontrará photo.jpg en su álbum "Saved Photos".

4). Elimine esta imagen de la biblioteca de activos:

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). Ir a la galería predeterminada, verá que photo.jpg ya se ha eliminado.

+0

No funciona para mí (iOS 7, Xcode 5). Sigo recibiendo un error de escritura y cuando registro la URL en el bloque de finalización, es nulo. (Estoy seguro de que mi activo es editable; de ​​hecho, copié tu código). – Garoal

+0

Hola desarrollador Δ, ¿has agregado photo.jpg a tu proyecto? Si no es el objeto de imagen antes de "writeImageToSavedPhotosAlbum: metadata: completionBlock:" debe ser nulo, por favor revise, gracias. – evanchin

+0

Hola, lo hago con una imagen generada mediante programación, que no es nula (lo compruebo) – Garoal

2

evanchin es correcto. Más aún, si usted quiere hacer esto en Xamarin.iOS (también conocido como 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 => { }); 

Este código será eliminar todas las imágenes que su aplicación añadirá a la ALAssetsLibrary.

1

Puede eliminar cualquier activo en la biblioteca utilizando SOLAMENTE API documentada.

  1. sobre escribir la función [ALAsset isEditable]:

    @implementation ALAsset(DELETE) 
    -(BOOL)isEditable{ 
        return YES; 
    } 
    @end 
    
  2. como evanchin dicho, eliminar el activo:

    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

obteniendo este error: 'Asset url (null) debe eliminarse. (Error Error Domain = ALAssetsLibraryErrorDomain Code = -3301 "Escribir ocupado" UserInfo = 0x17df6780 {NSLocalizedRecoverySuggestion = Intentar escribir de nuevo, NSLocalizedFailureReason = Hubo un problema al escribir este activo porque los recursos de escritura están ocupados., NSLocalizedDescription = Escribir ocupado, NSUnderlyingError = 0x17d1cae0 "Escribir ocupado"}) ' –

7

en ios8 borrar fotos podría ser posible usar el Marco de Fotos

Consulte la documentación de fotos marco

para eliminar los activos se refieren a PHAssetChangeRequest

+ (void)deleteAssets:(id<NSFastEnumeration>)assets 

donde assets es una matriz de PHAsset objetos que desea eliminar.

Para borrar colecciones se refieren a 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

Hola y bienvenidos a Stack Overflow. Tenga en cuenta que mientras su respuesta permanezca aquí, el enlace puede cambiar o dejar de estar disponible. Edita tu publicación para incluir los elementos esenciales del contenido del enlace. – Noich

+0

detalles añadidos, gracias Noich! – Ted

+0

@Ted ¿Puede proporcionarnos algún código de muestra sobre cómo llamarlo? No está claro qué importar y cómo llamar – Dinesh

3

Como dijo Ted, esto es ahora posible en iOS 8 utilizando el servicio de fotos. Es bastante limpio en realidad. Debe enviar una solicitud de cambio a la fototeca. Aquí hay un ejemplo.

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

Asegúrate de haber importado fotos y obtenido la autorización del usuario. (Que probablemente lo hizo para mostrar la imagen ya)

PHAssetchangeRequest - deleteAssets https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/index.html#//apple_ref/occ/clm/PHAssetChangeRequest/deleteAssets: PHPhotoLibrary Clase - authorizationStatus https://developer.apple.com/library/ios/documentation/Photos/Reference/PHPhotoLibrary_Class/#//apple_ref/occ/clm/PHPhotoLibrary/authorizationStatus