IOS AssetsLibrary框架的使用

转载地址:http://blog.csdn.net/xj2014/article/details/21872323#


AssetsLibrary框架提供了访问“照片”应用程序下的图片和视频。你可以使用该框架检索资源列表,也可以保存照片或视频到照片相册下。该框架的层次结构为:

ALAssetsLibrary-->ALAssetsGroup-->ALAsset-->ALAssetRepresentation

一、ALAssetsLibrary

ALAssetsLibrary代表系统中的整个资源库,可以读取所有的相册数据,即ALAssetsGroup列表。使用ALAssetsLibrary可以访问资源库中的照片和视频,也可以保存照片和视频。

1)authorizationStatus

获取访问照片列表的授权状态,用于判断当前应用是否可以访问资源库,是一个类方法。支持IOS6.0及以后的系统。其返回值类型有:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {  
  2.     ALAuthorizationStatusNotDetermined = 0// 用户还没有做出选择这个应用程序的问候  
  3.     ALAuthorizationStatusRestricted,        // 这个应用程序没有被授权访问照片数据。当前用户不能改变应用程序的状态,是受限制的。如家长控制权限  
  4.     ALAuthorizationStatusDenied,            // 用户已拒绝该应用程序访问照片数据  
  5.     ALAuthorizationStatusAuthorized         // 用户已授权该应用可以访问照片数据  
  6. }  
  7. int authorStatus=[ALAssetsLibrary authorizationStatus];  

2)disableSharedPhotoStreamsSupport

关闭检索和通知共享照片流的信息,是一个类方法。支持IOS6.0及以后的系统。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [ALAssetsLibrary disableSharedPhotoStreamsSupport];  
3)初始化

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ALAssetsLibrary *assetsLibrary=[[ALAssetsLibrary alloc]init];  
4)获取ALAsset和ALAssetsGroup
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //通过URL地址获取在相册中ALAsset,该方法是异步的  
  2. [assetsLibrary assetForURL:[NSURL URLWithString:@""] resultBlock:^(ALAsset *asset) {  
  3.         //成功返回ALAsset  
  4.     } failureBlock:^(NSError *error) {  
  5.         //获取失败  
  6.     }];  
  7. //通过URL地址获取相册ALAssetsGroup,该方法是异步的  
  8. [assetsLibrary groupForURL:[NSURL URLWithString:@""] resultBlock:^(ALAssetsGroup *group) {  
  9.         //成功返回ALAssetsGroup  
  10.     } failureBlock:^(NSError *error) {  
  11.         //获取失败  
  12.     }];  

5)根据资源类型遍历所有资源相册,即ALAssetsGroup集合

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //根据指定的资源类型遍历资源相册,该方法是异步的。stop参数为指针,但赋值为YES时,停止迭代  
  2. NSArray *arrayAssetsGroup=[[NSMutableArray alloc]init];  
  3. [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOLBOOL *stop) {  
  4.         if (group) {  
  5.             //group不为nil执行的操作,并将继续迭代下去  
  6.             [arrayAssetsGroup addObject:group];  
  7.         }else{  
  8.             //group为nil时执行的操作,并停止迭代,回到主线程  
  9.             [self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:YES];  
  10.         }  
  11.     } failureBlock:^(NSError *error) {  
  12.            //获取相册出错时,如该应用没有被授权访问相册时  
  13.            NSLog(@"错误Error:%@",error);  
  14.     }];  

资源类型有:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. enum {  
  2.     ALAssetsGroupLibrary        = (1 << 0),         // The Library group that includes all assets.  
  3.     ALAssetsGroupAlbum          = (1 << 1),         // All the albums synced from iTunes or created on the device.  
  4.     ALAssetsGroupEvent          = (1 << 2),         // All the events synced from iTunes.  
  5.     ALAssetsGroupFaces          = (1 << 3),         // All the faces albums synced from iTunes.  
  6.     ALAssetsGroupSavedPhotos    = (1 << 4),         // The Saved Photos album.  
  7. #if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED  
  8.     ALAssetsGroupPhotoStream    = (1 << 5),         // The PhotoStream album.  
  9. #endif  
  10.     ALAssetsGroupAll            = 0xFFFFFFFF,       // The same as ORing together all the available group types,  
  11. };  

6)创建一个相册到资源相册中

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //创建一个名为“test”的相册,该方法是异步的  
  2. [assetsLibrary addAssetsGroupAlbumWithName:@"test" resultBlock:^(ALAssetsGroup *group) {  
  3.       //创建成功后,返回group;如果已经存在了名为“test”的相册,则返回一个nil的group  
  4.     } failureBlock:^(NSError *error) {  
  5.       //创建失败,可能原因有:1、用户没有授权 2、创建的资源名,时不可获得的   
  6. }];  
7)保存照片或视频到系统默认相册中

1、保存图片到系统默认的相册中,以NSData形式

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [assetsLibrary writeImageDataToSavedPhotosAlbum:imageData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {  
  2.        //保存后返回assetUrl;如果error等于nil,则保存成功   
  3.     }];  
2、保存图片到默认的相册中,以CGImageRef的形式

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [assetsLibrary writeImageToSavedPhotosAlbum:cgImageRef metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {  
  2.     //保存后返回assetUrl;如果error等于nil,则保存成功  
  3.  }];  
3、保存图片到默认的相册中,以CGImageRef的形式,并选择旋转方向

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [assetsLibrary writeImageToSavedPhotosAlbum:cgImageRef orientation:ALAssetOrientationDown completionBlock:^(NSURL *assetURL, NSError *error) {  
  2.       //保存后返回assetUrl如果error等于nil,则保存成功  
  3.  }];  
  4. //旋转方向  
  5. typedef NS_ENUM(NSInteger, ALAssetOrientation) {  
  6.  ALAssetOrientationUp,             //方向向上 默认  
  7.  ALAssetOrientationDown,           // 方向向下  
  8.  ALAssetOrientationLeft,           // 方向向左  
  9.  ALAssetOrientationRight,          // 方向向右  
  10.  ALAssetOrientationUpMirrored,     // 图像沿水平方向,向上翻转  
  11.  ALAssetOrientationDownMirrored,   // 图像沿水平方向,向下翻转  
  12.  ALAssetOrientationLeftMirrored,   // 图像沿垂直方向,向左翻转  
  13.  ALAssetOrientationRightMirrored,  // 图像沿垂直方向,向右翻转  
  14. };  
4、保存视频到默认的相册中

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //在保存视频之前,先验证一下该视频文件是否与该相册资源相匹配  
  2. if ([assetsLibrary videoAtPathIsCompatibleWithSavedPhotosAlbum:[NSURL fileURLWithPath:videoPath]]) {     
  3.     //保存视频到默认相册中  
  4.     [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:videoPaht] completionBlock:^(NSURL *assetURL, NSError *error) {   
  5.         //保存后返回视频资源的url;如果error等于nil,则保存成功  
  6.  }]; }  
二、ALAssetsGroup

ALAssetsGroup代表资源库中的每一个资源集合。即每一个ALAssetsGroup就是用户在“照片”应用程序中所看到的相册集合。

1)属性editable

editable,是一个只读属性。如果返回值为YES,表示该资源集合可以编辑,反之,则不可以编辑。支持IOS5.0及以后的系统。

2)方法addAsset:

添加已存在的资源(ALAsset)到该集合中,在添加之前应该先判断,该资源集合是否允许编辑啊。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if (self.assetsGroup.editable) {  
  2.         if ([self.assetsGroup addAsset:asset]) {  
  3.             NSLog(@"资源添加成功!");  
  4.         }else{  
  5.             NSLog(@"资源添加失败");//除了该资源集合不允许编辑导致添加失败以外,还有可能就是该资源本身不允许添加到该资源集合中  
  6.         }  
  7.     }  
3)方法valueForProperty:

返回该资源集合的属性值,支持IOS4.0及以后

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. NSLog(@"资源集合相册的名称:%@",[assetsGroup valueForProperty:ALAssetsGroupPropertyName]);  
  2. NSLog(@"资源集合相册的类型:%@",[assetsGroup valueForProperty:ALAssetsGroupPropertyType]);  
  3. NSLog(@"资源集合相册的存储ID:%@",[assetsGroup valueForProperty:ALAssetsGroupPropertyPersistentID]);  
  4. NSLog(@"资源集合相册的存储地址URL:%@",[assetsGroup valueForProperty:ALAssetsGroupPropertyURL]);  

4)方法setAssetsFilter:

用于筛选资源集合,其参数为ALAssetsFilter。同一时间,只能有一个筛选条件有效。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [assetsGroup setAssetsFilter:[ALAssetsFilter allPhotos]];  

1、ALAssetsFilter使用

ALAssetsFilter用于资源集合的筛选条件,它只有3个类方法:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [ALAssetsFilter allPhotos]; //在资源集合中获取图片  
  2. [ALAssetsFilter allVideos]; //在资源集合中获取视频  
  3. [ALAssetsFilter allAssets]; //获取所有资源  

5)posterImage、numberOfAssets
posterImage获取的是该资源集合及相册的封面,返回值为CGImageRef。numberOfAssets获取的是该资源集合过滤后的的资源数量,如果没有过滤则获取的是所有的资源数量。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //获取封面图片  
  2. CGImageRef imageRef=[self.assetsGroup posterImage];  
  3. UIImage *posterImage=[UIImage imageWithCGImage:imageRef];  
  4. //获取资源数量  
  5. NSInteger *assetCount=[self.assetsGroup numberOfAssets];  
6)遍历资源数组
遍历资源数组获取资源,ALAssetsGroup提供了3中方法:1、普通的遍历,2、指定操作方式遍历,3、指定操作方式及指定索引集遍历资源。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //enumerateAssets都是同步的,所以我放在了一个线程中执行遍历  
  2. NSMutableArray *arrayAsset=[[NSMutableArray alloc]init];  
  3. // 获取全局调度队列,后面的标记永远是0  
  4. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  5. // 创建调度群组  
  6. dispatch_group_t group = dispatch_group_create();  
  7. // 向调度群组添加异步任务,并指定执行的队列  
  8. dispatch_group_async(group, queue, ^{  
  9.     [self.assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOLBOOL *stop) {  
  10.         //result不为nil则存在资源,继续遍历;为nil则不存在资源,结束遍历  
  11.         //index为该资源在资源集合中的索引  
  12.         //stop为一个指针,当给其赋值YES时,停止遍历  
  13.         if (result) {  
  14.             [arrayAsset addObject:result];  
  15.         }else{  
  16.             dispatch_async(dispatch_get_main_queue(), ^{  
  17.                 NSLog(@"回到主线程");  
  18.             });  
  19.         }  
  20.     }];  
  21. });  
  22. //指定操作方式的,遍历。操作方式有:  
  23. //NSEnumerationConcurrent:同步的方式遍历  
  24. //NSEnumerationReverse:倒序的方式遍历  
  25. [self.assetsGroup enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOLBOOL *stop) {  
  26.    //同上  
  27. }];  
  28. NSMutableIndexSet *indexes=[NSMutableIndexSet indexSetWithIndex:1];  
  29. [indexes addIndex:2];  
  30. //同上一个操作方式  
  31. //Indexes是一个索引集合,ALAssetsGroup将会取出在该索引集合中的资源  
  32. [self.assetsGroup enumerateAssetsAtIndexes:indexes options:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOLBOOL *stop) {  
  33.    //同上  
  34. }];  
三、ALAsset

ALAsset代表相册中的每一个资源,可以通过ALAsset获取该资源的信息,也可以修改资源文件。

1)方法valueForProperty:

返回该资源集合的属性值,支持IOS4.0及以后。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //valueForProperty的属性值无效将返回:ALErrorInvalidProperty  
  2. NSLog(@"资源类别:%@",[asset valueForProperty:ALAssetPropertyType]);//有三种资源类别:ALAssetTypePhoto(图片), ALAssetTypeVideo(视频),ALAssetTypeUnknown(未知)  
  3. NSLog(@"资源拍摄地点:%@",[asset valueForProperty:ALAssetPropertyLocation]);  
  4. NSLog(@"视频持续时间:%@",[asset valueForProperty:ALAssetPropertyDuration]);  
  5. NSLog(@"资源方向:%@",[asset valueForProperty:ALAssetPropertyOrientation]);//值为枚举类型:ALAssetOrientation  
  6. NSLog(@"资源创建时间:%@",[asset valueForProperty:ALAssetPropertyDate]);  
  7. NSLog(@"资源UTI数组:%@",[asset valueForProperty:ALAssetPropertyRepresentations]);  
  8. NSLog(@"资源URL:%@",[asset valueForProperty:ALAssetPropertyAssetURL]);  
  9. NSLog(@"资源key-value集合:%@",[asset valueForProperty:ALAssetPropertyURLs]);//key:为uti;value:为url  
2)defaultRepresentation与representationForUTI

defaultRepresentation返回的是默认的资源详细信息类(ALAssetRepresentation),representationForUTI则是通过UTI值来获取资源信息类。关于ALAssetRepresentation下面将会介绍到。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ALAssetRepresentation *rep=[asset defaultRepresentation];  
  2. ALAssetRepresentation *rep=[asset representationForUTI:@"public.jpeg"];  

3)thumbnail与aspectRatioThumbnail

thumbnail是以正方形截取的一个缩略图,aspectRatioThumbnail则是一个等比例缩略图。它们都是适合该系统的且方向都没有问题。返回值为CGImageRef。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. UIImage *thumbnail=[UIImage imageWithCGImage:[asset thumbnail]];  
  2. UIImage *aspectThumbnail=[UIImage imageWithCGImage:[asset aspectRatioThumbnail]];  

4)editable与originalAsset

editable,是一个只读属性。如果返回值为YES,表示该资源可以编辑,反之,则不可以编辑。应用仅允许编辑最开始写入的资源。originalAsset ,如果另存了一个修改后的资源,则返回一个资源,否则返回nil。 支持IOS5.0及以后的系统。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. BOOL editAble=asset.editable;  
  2. ALAsset *originalAset=asset.originalAsset;  

5)setImageData:metadata:completionBlock与setVideoAtPath:completionBlock:

setImageData:metadata:completionBlock:用于替换掉原来的资源图片为给定的图片,setVideoAtPath:completionBlock:用于替换掉原来的资源视频为给定的视频。两者在使用之前,应该要先检查属性editable。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //在替换愿资源图片时,应该先要检查该资源是否可以编辑  
  2. if (asset.editable) {  
  3.     [asset setImageData:imageData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {  
  4.          //如果替换成功,则返回一个资源的url,否则,assetURL为nil  
  5.     }];  
  6. }  
  7. //在替换愿资源视频时,应该先要检查该资源是否可以编辑  
  8. if (asset.editable) {  
  9.     [asset setVideoAtPath:videoUrl completionBlock:^(NSURL *assetURL, NSError *error) {  
  10.           //如果替换成功,则返回一个资源的url,否则,assetURL为nil  
  11.     }];  
  12. }  

6)保存资源的默认相册中

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //保存一个新的图片资源,重新生成一个图片  
  2. [asset writeModifiedImageDataToSavedPhotosAlbum:imageData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {  
  3.       //成功后,返回一个新的图片URL  
  4. }];  
  5. //保存一个新的视频资源,重新生成一个视频  
  6. [asset writeModifiedVideoAtPathToSavedPhotosAlbum:videoUrl completionBlock:^(NSURL *assetURL, NSError *error) {  
  7.       //成功后,返回一个新的图片URL  
  8. }];  

四、ALAssetRepresentation

ALAssetRepresentation代表资每一个资源文件的详细信息。获取ALAssetRepresentation的一种方式如下:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ALAssetRepresentation *representation=[asset defaultRepresentation];  
1)基本属性介绍

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. NSLog(@"资源文件的UTI:%@",[representation UTI]); //唯一标识符  
  2. NSLog(@"资源图片宽高:%@",NSStringFromCGSize([representation dimensions])); //不存在则返回CGSizeZero  
  3. NSLog(@"资源文件容量大小:%lld",[representation size]);  
  4. NSLog(@"资源文件的URL:%@",[representation url]);  
  5. NSLog(@"资源文件的旋转方向:%d",[representation orientation]); //值为上面介绍的方向枚举类型中的一个  
  6. NSLog(@"资源图片的缩放比例:%f",[representation scale]);  
  7. NSLog(@"资源文件的名称:%@",[representation filename]);  
  8. NSLog(@"资源文件的元数据:%@",[representation metadata]); //返回一个字典,如果不存在则返回nil  
  9. UIImage *resolutionImage=[UIImage imageWithCGImage:[representation fullResolutionImage]]; //资源图片高清图,不存在则返回NULL  
  10. UIImage *fullScreenImage=[UIImage imageWithCGImage:[representation fullScreenImage]];     //资源图片的全屏图,不存在则返回NULL  
2) getBytes:fromOffset:length:error:

该方法可以把资源指定的部分,写入缓冲区即内存中保存,返回保存成功后的文件大小。注意:用该方法,文件太大容易是程序的查处内存上限,程序容易闪退。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Byte *fileBuffer = (Byte*)malloc((long)representation.size); //开辟内存空间,最为缓冲区  
  2. NSUInteger bufferSize = [representation getBytes:fileBuffer fromOffset:0 length:(long)representation.size error:nil]; //把资源文件写入缓冲区  
  3. NSData *data = [NSData dataWithBytesNoCopy:fileBuffer length:bufferSize freeWhenDone:YES];//把该缓冲区的文件指向NSData  
3)CGImageWithOptions:

该方法,我没有用过,不是很熟,大概用法是:定义一个获取方式字典options,调用该方法返回CGImageRef的图片。哪位大神知道的还请指教。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #import <ImageIO/ImageIO.h>  
  2. NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:  
  3.             (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailWithTransform,  
  4.             (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailFromImageAlways,  
  5.             (id)[NSNumber numberWithFloat:200], kCGImageSourceThumbnailMaxPixelSize,  
  6.             nil nil];  
  7. CGImageRef optionsThumbnail = [representation CGImageWithOptions:options];  
  8. UIImage *thumbnailImage = [UIImage imageWithCGImage:optionsThumbnail];  
AssetsLibrary框架介绍到此结束。有不对的地方,请各位大神指正,谢谢!

附:据此写的一个媒体(图片/视频)浏览起框架:点击打开链接

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值