在手機相冊(ios設備相冊)中建立相冊

這篇博客的主要內容來源於cocoachina 裏的貼子,代碼能實如今在手機相冊(ios設備相冊)中建立相冊的功能,下面我就原文整理,在擴展一下。php

原文地址:http://www.cocoachina.com/bbs/read.php?tid=143383ios

一:添加照片到相冊中(不在ios設備的相冊中建立相冊)

使用代碼異步

    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

使用這句話就能把圖片存入照片中了async


二:在手機相冊(ios設備相冊)中建立相冊

第一步:向工程裏添加AssetsLibrary 庫文件

第二步:在項目中"import" 導入庫(在哪用就在哪導入)

#import <AssetsLibrary/AssetsLibrary.h>


核心代碼

在須要添加相冊的地方調用代碼spa

//添加到相冊我讓它執行是異步執行的方式,若是不想用這種方式,能夠不去開一個線程
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        [self createAlbumInPhoneAlbum];
        
    });

#pragma mark - 在手機相冊中建立相冊
- (void)createAlbumInPhoneAlbum
{
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    NSMutableArray *groups=[[NSMutableArray alloc]init];
    ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop)
    {
        if (group)
        {
            [groups addObject:group];
        }
        
        else
        {
            BOOL haveHDRGroup = NO;
            
            for (ALAssetsGroup *gp in groups)
            {
                NSString *name =[gp valueForProperty:ALAssetsGroupPropertyName];
                
                if ([name isEqualToString:@"相冊名字"])
                {
                    haveHDRGroup = YES;
                }
            }
            
            if (!haveHDRGroup)
            {
                //do add a group named "XXXX"
                [assetsLibrary addAssetsGroupAlbumWithName:@"相冊名字"
                                               resultBlock:^(ALAssetsGroup *group)
                 {
                     [groups addObject:group];
                     
                 }
                                              failureBlock:nil];
                haveHDRGroup = YES;
            }
        }
        
    };
    //建立相簿
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil];
    
    [self saveToAlbumWithMetadata:nil imageData:UIImagePNGRepresentation(self.imageView.image) customAlbumName:@"相冊名字" completionBlock:^
     {
         //這裏能夠建立添加成功的方法
         
     }
      failureBlock:^(NSError *error)
     {
         //處理添加失敗的方法顯示alert讓它回到主線程執行,否則那個框框死活不願彈出來
         dispatch_async(dispatch_get_main_queue(), ^{
             
             //添加失敗通常是由用戶不容許應用訪問相冊形成的,這邊能夠取出這種狀況加以判斷一下
             if([error.localizedDescription rangeOfString:@"User denied access"].location != NSNotFound ||[error.localizedDescription rangeOfString:@"用戶拒絕訪問"].location!=NSNotFound){
                 
                 UIAlertView *alert=[[UIAlertView alloc]initWithTitle:error.localizedDescription message:error.localizedFailureReason delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", nil) otherButtonTitles: nil];
                 
                 [alert show];
                 [alert release];
                
                  }
         });
     }];
}

- (void)saveToAlbumWithMetadata:(NSDictionary *)metadata
                      imageData:(NSData *)imageData
                customAlbumName:(NSString *)customAlbumName
                completionBlock:(void (^)(void))completionBlock
                   failureBlock:(void (^)(NSError *error))failureBlock
{
    
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    void (^AddAsset)(ALAssetsLibrary *, NSURL *) = ^(ALAssetsLibrary *assetsLibrary, NSURL *assetURL) {
        [assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) {
            [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
            
                if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:customAlbumName]) {
                    [group addAsset:asset];
                    if (completionBlock) {
                        completionBlock();
                    }
                }
            } failureBlock:^(NSError *error) {
                if (failureBlock) {
                    failureBlock(error);
                }
            }];
        } failureBlock:^(NSError *error) {
            if (failureBlock) {
                failureBlock(error);
            }
        }];
    };
    [assetsLibrary writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error) {
        if (customAlbumName) {
            [assetsLibrary addAssetsGroupAlbumWithName:customAlbumName resultBlock:^(ALAssetsGroup *group) {
                if (group) {
                    [assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) {
                        [group addAsset:asset];
                        if (completionBlock) {
                            completionBlock();
                        }
                    } failureBlock:^(NSError *error) {
                        if (failureBlock) {
                            failureBlock(error);
                        }
                    }];
                } else {
                    AddAsset(assetsLibrary, assetURL);
                }
            } failureBlock:^(NSError *error) {
                AddAsset(assetsLibrary, assetURL);
            }];
        } else {
            if (completionBlock) {
                completionBlock();
            }
        }
    }];
}


3、ALAssetsLibraryALAssetsGroup、ALAsset 介紹

一、ALAssetsLibrary

ALAssetsLibrary提供了咱們對iOS設備中的相片、視頻的訪問。它是鏈接了咱們應用程序和相冊之間的訪問的一個橋樑。線程


二、ALAssetsGroup

指代一個相冊。code


三、ALAsset

每個ALAsset表明一個單一資源文件(也就是一張圖片,或者一個視頻文件)orm


四、ALAssetRepresentation

ALAssetRepresentation封裝了ALAsset,包含了一個資源文件中的不少屬性。(能夠說是ALAsset的不一樣的表示方式,本質上都表示同一個資源文件)視頻

相關文章
相關標籤/搜索