2012-02-15 15 views
7

En mi aplicación, hay un botón, el usuario simplemente haga clic en él y la última foto en la biblioteca se puede recuperar en la pantalla directamente. ¿Cómo obtener la última foto en la biblioteca?¿Cómo obtener la última foto en la biblioteca de iPhone?


2012/02/17

esto puede llegar a ALAsset

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
    { 
     if(result != nil) 
     { 

      [self.assets addObject:result]; 

     } 
    }; 

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
    { 
     if(group != nil) 
     { 
      [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
      [group enumerateAssetsUsingBlock:assetEnumerator]; 
     }else{ 
      self.image = [self getLastImage]; 

     } 

    }; 
    ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ 
     NSLog(@"error occour =%@", [myerror localizedDescription]); 
    }; 


    assets = [[NSMutableArray alloc] init]; 
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:failureblock]; 
    [assetsLibrary release]; 

Para obtener la fecha del archivo Uso este

assetURLArray = [[NSMutableArray alloc] init]; 
    for (ALAsset *asset in self.assets) { 
     NSDate * date = [asset valueForProperty:ALAssetPropertyDate]; 

Entonces me encontré con que la última imagen sea siempre el primero de assetURLArray, así que finalmente obtengo el último como este

if (self.assets && [self.assets count]) { 
     ALAsset *asset = [self.assets objectAtIndex:([self.assets count] - 1)]; 
     CGImageRef ref = [[asset defaultRepresentation]fullResolutionImage]; 

No sé si esto siempre funciona ... espero que alguien me pueda probar.

Y no estoy buscando una manera de sincronizar hilo ...

+0

que sólo puede hacer '[self.assets LastObject] ', que devuelve amablemente nil si el recuento es 0. –

Respuesta

2

Este fragmento de código puede recuperar un ALAsset:

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger 
index, BOOL *stop) { 
    if(result != nil) { 
     [self.assets addObject:result]; 
    } 
}; 

void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) { 
    if(group != nil) { 
     [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
     [group enumerateAssetsUsingBlock:assetEnumerator]; 
    } else { 
     self.image = [self getLastImage]; 
    } 
}; 

ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) { 
    NSLog(@"error occour =%@", [myerror localizedDescription]); 
}; 

assets = [[NSMutableArray alloc] init]; 
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:failureblock]; 
[assetsLibrary release]; 

Para obtener la fecha del archivo Uso este:

assetURLArray = [[NSMutableArray alloc] init]; 
for (ALAsset *asset in self.assets) { 
    NSDate * date = [asset valueForProperty:ALAssetPropertyDate]; 

Entonces me encontré con que la última imagen sea siempre la parte superior de assetURLArray, así que finalmente obtengo la última como esta:

if (self.assets && [self.assets count]) { 
    ALAsset *asset = [self.assets objectAtIndex:([self.assets count] - 1)]; 
    CGImageRef ref = [[asset defaultRepresentation] fullResolutionImage]; 

No sé si esto siempre funciona ... Espero que alguien pueda aclarar mis dudas al respecto.

Y no estoy buscando una manera de sincronizar hilo ...


2012-04-03 Actualización

Ahora uso NSNotification para resolver este problema:

- (void)gotLastImageCallBack { 
    if (notifyName) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:notifyName object:nil]; 
    } 
} 

Después de recuperar la imagen, la notificación envía una llamada a la clase relacionada.

2

que necesita para obtener toda la fotos la fecha de creación y luego ordenarlos por fecha.

- (NSDictionary *) attributesForFile:(NSURL *)anURI { 

// note: singleton is not thread-safe 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSString *aPath = [anURI path]; 

if (![fileManager fileExistsAtPath:aPath]) return nil; 

NSError *attributesRetrievalError = nil; 
NSDictionary *attributes = [fileManager attributesOfItemAtPath:aPath 
          error:&attributesRetrievalError]; 

if (!attributes) { 
    NSLog(@"Error for file at %@: %@", aPath, attributesRetrievalError); 
    return nil; 
} 

NSMutableDictionary *returnedDictionary = 
    [NSMutableDictionary dictionaryWithObjectsAndKeys: 
     [attributes fileType], @"fileType", 
     [attributes fileModificationDate], @"fileModificationDate", 
     [attributes fileCreationDate], @"fileCreationDate", 
     [NSNumber numberWithUnsignedLongLong:[attributes fileSize]], @"fileSize", 
    nil]; 

return returnedDictionary; 
} 
+0

gracias, pero ¿cómo tener acceso a photo lib y leer todas las imágenes en cada álbum? –

+1

http://www.icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/ –

+0

Cheers mate !!!! –

11

Puede hacerlo simplemente siguiendo el método de ALAssetsGroup

(void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;** 

    applying **NSEnumerationReverse** option 

    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
     { 
      if(result != nil) 
      { 

       [self.assets addObject:result]; 

      } 
     }; 

     void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
     { 
      if(group != nil) 
      { 
       [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
       [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:assetEnumerator]; 
      } 

     }; 
     ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ 
      NSLog(@"error occour =%@", [myerror localizedDescription]); 
     }; 


     assets = [[NSMutableArray alloc] init]; 
     ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
     [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:assetGroupEnumerator failureBlock:failureblock]; 
     [assetsLibrary release]; 


    **Your self.assets array will have latest images** 
0
UIButton *photoAlbum = [[UIButton alloc] init]; 
[photoAlbum addTarget:self action:@selector(getLatestPhoto:) forControlEvents:UIControlEventTouchDown]; 

-(void)getLatestPhoto 
{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    [library enumerateGroupsWithTypes:ALAssetsGroupLibrary usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    { 
     [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
     if ([group numberOfAssets] > 0) 
     { 
      [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:[group numberOfAssets]-1] options:0 
          usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) 
      { 

      }]; 
     } 
    } 
     failureBlock: ^(NSError *error) 
    { 
     NSLog(@"No Photo"); 
    }]; 
} 
0

a hacer esto chicos

void (^enumerate)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
{ 
    if ([[group valueForProperty:@"ALAssetsGroupPropertyType"] intValue] == ALAssetsGroupSavedPhotos) 
    { 
     NSLog(@"Camera roll"); 
     [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
      if(result != nil){ 
       ALAssetRepresentation *rep = [result defaultRepresentation]; 
       [thumbnailsArray insertObject:rep atIndex:0]; 
      } 

     }]; 
    } 
Cuestiones relacionadas