注:當你選擇看這篇博客時想必你的應用還支持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();
}
}
}];
}
