iOS開發之獲取系統相冊ALAssetLibrary


注:當你選擇看這篇博客時想必你的應用還支持iOS8一下系統,如果你的應用要求最低版本大於iOS8,建議使用PhotoKit框架,效率更高

 

ALAssetsLibrary包含,ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRepresentation幾個類

1、框架解析

 

(1) ALAssetsLibrary

 ALAssetsLibrary類可以實現查看相冊列表,增加相冊,保存圖片到相冊等功能

 具體實現見框架使用

 

(2) ALAssetsGroup

 ALAssetsGroup就是相冊的類,可以通過ALAssetsLibrary遍歷得到相冊ALAssetsGroup

 

通過valueForProperty:獲取相冊名稱

[assetsGroup valueForProperty:ALAssetsGroupPropertyName]

 

 ALAssetsGroup 可以使用setAssetsFilter:(ALAssetsFilter *)filter過濾照片或者視頻詳情見ALAssetsFilter

 

(3) ALAsset

ALAsset就是一個資源文件,一個ALAssetsGroup下會有多個資源文件,獲取相冊和視頻就是通過ALAssetsLibrary遍歷得到相冊ALAssetsGroup,

然后通過ALAssetsGroup遍歷得到資源文件ALAsset

 

通過valueForProperty:獲取資源文件的信息:

//查看資源的文件類型

[asset valueForProperty:ALAssetPropertyType]

 //查看資源的文件類型

[asset valueForProperty:ALAssetPropertyType]

 //查看資源的地理位置信息
 [asset valueForProperty:ALAssetPropertyLocation]
 //如果資源是視頻,查看視頻的時長
  [asset valueForProperty:ALAssetPropertyDuration]
 //查看資源的方向,圖片的旋轉方向
 [asset valueForProperty:ALAssetPropertyOrientation]
  //查看資源的創建時間
 [asset valueForProperty:ALAssetPropertyDate]
  //查看資源的描述信息
  [asset valueForProperty:ALAssetPropertyRepresentations]
  //查看資源的url路徑
  [asset valueForProperty:ALAssetPropertyAssetURL]

 

通過 asset.defaultRepresentation 可以獲取資源文件的url、size、name等信息

// 獲取資源文件url

asset.defaultRepresentation.url

// 獲取資源文件大小

asset.defaultRepresentation.size

// 獲取資源文件名稱

asset.defaultRepresentation.filename

 

(4) ALAssetsFilter

ALAssetsFilter主要用於過濾圖片和視頻

 

通過setAssetsFilter:篩選資源文件

//篩選圖片和視頻

[group setAssetsFilter:[ALAssetsFilter allAssets]];

 //篩選圖片

 [group setAssetsFilter:[ALAssetsFilter allPhotos]];

 //篩選視頻

 [group setAssetsFilter:[ALAssetsFilter allVideos]];

 

(5) ALAssetRepresentation

 ALAsset類有一個defaultRepresentation方法,返回值是ALAssetRepresentation類,該類的作用就是獲取該資源圖片的詳細資源信息。

 

通過representation 獲取資源文件信息

// //獲取資源圖片的詳細資源信息

ALAssetRepresentation* representation = [asset defaultRepresentation];

//獲取資源圖片的長寬

CGSize dimension = [representation dimensions];

 //獲取資源圖片的高清圖

[representation fullResolutionImage];

//獲取資源圖片的全屏圖

[representation fullScreenImage];

//獲取資源圖片的名字

NSString* filename = [representation filename]; NSLog(@"filename:%@",filename);

//縮放倍數

[representation scale];

//圖片資源容量大小

[representation size];

//圖片資源原數據  

[representation metadata];

//旋轉方向

[representation orientation];  

//資源圖片url地址,該地址和ALAsset通過ALAssetPropertyAssetURL獲取的url地址是一樣的

 [representation url];

//資源圖片uti,唯一標示符

[representation UTI]

 

2、框架使用

(1)遍歷得到圖片視頻資源

 

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]

[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll  usingBlock:resultsBlock  failureBlock:nil];

 

ALAssetsLibraryGroupsEnumerationResultsBlock resultsBlock = ^(ALAssetsGroup *group, BOOL *stop) {

    NSString * str = [group valueForProperty:ALAssetsGroupPropertyName];

    // 得到相冊

    if (group){

           [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

            // 得到資源文件

            if (asset) {

                NSString *type = [asset valueForProperty:ALAssetPropertyType];

                if ([type isEqual:ALAssetTypePhoto] )

                {

                    dispatch_async(dispatch_get_global_queue(0, 0), ^{

                        [self addAssetWith:asset title:[self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]];

                    });

                    self.numberOfPhotos ++;

                    AddFileSelectModel *assetSelectModel = [[AddFileSelectModel alloc] init];

                    assetSelectModel.asset = asset;

                    assetSelectModel.selected = NO;

 

                    NSDate *date = [assetSelectModel.asset valueForProperty:ALAssetPropertyDate];

                    NSTimeInterval time = date.timeIntervalSince1970;

                    assetSelectModel.date = (NSInteger)time;

                    

                    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];

                    [formatter setDateFormat:@"yyyy-MM-dd HH:MM:ss"];

                    NSString *str = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:time]];

                    NSLog(@"%@",str);

                    [self.assets addObject:assetSelectModel];                        

                        self.assets = [[[self.assets reverseObjectEnumerator] allObjects] mutableCopy];

                      

                        dispatch_async(dispatch_get_main_queue(), ^{

                            [self.collectionView reloadData];

                        });

                    }

                }

            }

        }];

    }

};

 

(2)在系統相冊中創建相冊

- (void)createAlbumInPhone

{

    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) {

                [assetsLibrary addAssetsGroupAlbumWithName:@"聯系家庭雲" resultBlock:^(ALAssetsGroup *group) {

                     [groups addObject:group];

                 } failureBlock:nil];

                haveHDRGroup = YES;

            }

        }

    };

    //創建相簿

    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil];

}

 

(3)在系統相冊中保存圖片

 

- (void)saveImageToAlbum:(UIImage *)image

 

{

 

    [self saveToAlbumWithMetadata:nil imageData:UIImageJPEGRepresentation(image,1.0) 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];

            }

        });

    }];

}

 

- (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();

            }

        }

    }];

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM