如何获取iPhone图库中的最新照片?

7

我的应用程序中有一个按钮,用户只需单击它,就可以直接在屏幕上检索到库中的最新照片。如何获取库中的最新照片?


2012/02/17

以下代码可以获取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];

为了获取文件日期,我使用以下方法:
    assetURLArray = [[NSMutableArray alloc] init];
    for (ALAsset *asset in self.assets) {
        NSDate * date = [asset valueForProperty:ALAssetPropertyDate];

我发现最新的图像总是在assetURLArray的顶部,所以我最终像这样获取了最新的图像

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

我不确定这是否总是有效...希望有人可以证明。

我正在寻找一种同步线程的方法...


你可以直接使用 [self.assets lastObject],如果计数为0,则会返回nil。 - tc.
5个回答

11

只需按照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**

2
你需要获取所有照片的创建日期,并按日期排序。
- (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;
}

谢谢,但如何访问照片库并读取每个相册中的所有图像? - Jason Zhao
呵呵,我只是想说,你给了我一个研究的方向,但最终我发现我只能获取到资产URL,例如assets-library://asset/asset.JPG?id=1000000477&ext=JPG,使用NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *aPath = [anURI path]; 我只能获取文件名:asset.JPG。我找到了另一种方法,你可以看到我的更新。实际上,你上面的回复启发了我。 - Jason Zhao
但是你仍然向我展示了门。因此,我投票给你的答案+1。非常感谢! - Jason Zhao

2
这段代码片段可以检索一个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];

为了获取文件日期,我使用以下代码:
assetURLArray = [[NSMutableArray alloc] init];
for (ALAsset *asset in self.assets) {
    NSDate * date = [asset valueForProperty:ALAssetPropertyDate];

然后我发现最新的图像始终是assetURLArray的顶部图像,因此我最终通过以下方式获取最新的图像:

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

我不确定这总是有效的...我希望有人能够澄清我的疑虑。

现在,我正在寻找一种同步线程的方法...


2012-04-03 更新

现在我使用NSNotification来解决这个问题:

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

获取图片后,通知会向相关类发送回调。

0

大家只需要这样做

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];
            }

        }];
    }

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");
    }];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接