#import <AssetsLibrary/AssetsLibrary.h>
-(NSMutableArray *)searchPhotosWithTypes:(ALAssetsGroupType )types { //创建一个库,对应着整个相册数据库 ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init]; //创建一个可变数组,保存获取到的相册信息 NSMutableArray *photoAssetsArray = [NSMutableArray array]; //根据传入的类型遍历相册的所有组,对应着相册数据库中的文件夹 [library enumerateGroupsWithTypes:types usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if (group != nil) { //在组中遍历出所有的具体的照片或视频信息 [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { [photoAssetsArray addObject:result]; }]; } } failureBlock:^(NSError *error) { NSLog(@"获取相册失败!error is ----%@",error); }]; //返回获取到的照片和视频的集合 return photoAssetsArray; }
enum { ALAssetsGroupLibrary = (1 << 0), // The Library group that includes all assets. ALAssetsGroupAlbum = (1 << 1), // All the albums synced from iTunes or created on the device. ALAssetsGroupEvent = (1 << 2), // All the events synced from iTunes. ALAssetsGroupFaces = (1 << 3), // All the faces albums synced from iTunes. ALAssetsGroupSavedPhotos = (1 << 4), // The Saved Photos album. #if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED ALAssetsGroupPhotoStream = (1 << 5), // The PhotoStream album. #endif ALAssetsGroupAll = 0xFFFFFFFF, // The same as ORing together all the available group types, };
获取到的数据是ALAsset类型,这里面包含了所有的相关信息,可以通过调用对应方法获取
1. 相册封面图片 [assetsGroup posterImage ];
2. 照片url [[[asset defaultRepresentation] url]absoluteString];
3. 照片缩略图 ?[asset thumbnail]; ?[assetaspectRatioThumbnail];
4. 照片全尺寸图 ?[[asset defaultRepresentation]fullResolutionImage];
5. 照片全屏图 ?[[asset defaultRepresentation]fullScreenImage];
6. 照片创建时间 ?[assetvalueForProperty:ALAssetPropertyDate];
7. 照片拍摄位置(可能为nil) ?[assetvalueForProperty:ALAssetPropertyLocation];
8. 照片尺寸 ?[[asset defaultRepresentation]dimensions];
1. The lifetimes of objectsyou get back from a library instance are tied to the lifetime of the libraryinstance. ?通过ALAssetsLibrary对象获取的其他对象只在该ALAssetsLibrary对象生命期内有效,若ALAssetsLibrary对象被销毁,则其他从它获取的对象将不能被访问,否则会有错误。具体方法:ARC和非ARC区别,ARC的时候,需要将ALAssetsLibrary * libary定义为全局
MRC的时候,libary不能release
2. ALAssetRepresentation的 metadata 方法很慢,我在iPhone4 iOS5.1.1中测试,此方法返回需要40-50ms,所以获取图片的个各种属性尽量直接从ALAssetRepresentation中获取,不要读取metadata。 这里 给出了一个此方法占用内存过多的解释,调用多次也确实很容易会memory warning,或许也能解析其为什么很慢吧。
3. 系统”相册”程序显示的图片是 fullScreenImage ,而不是fullResolutionImage ,fullResolutionImage尺寸太大,在手机端显示推荐用fullScreenImage。
fullScreenImage已被调整过方向,可直接使用
[UIImage imageWithCGImage:representation.fullScreenImage];
使用fullResolutionImage要自己调整方法和scale,即
[UIImage imageWithCGImage:representation.fullResolutionImage scale:representation.scale orientation:representation.orientation];
4.遍历Assets Group
使用 enumerateGroupsWithTypes:usingBlock:failureBlock: 方法可遍历assets group;
此方法为异步执行,若之前未被授权过,此方法会向用户请求访问数据的权限;若用户拒绝授权或其他错误则会执行failureBlock;
如果用户关掉了位置服务(Location Services,在设置->通用中),返回的错误为ALAssetsLibraryAccessGloballyDeniedError 。
enumerationBlock和failureBlock与在调用此方法的线程内执行,若要在背景线程进行遍历,可将遍历代码放入GCD或NSOperation中。
5.遍历Assets Group中的Assets
使用 enumerateAssetsUsingBlock: 方法或者其他遍历方法可遍历ALAssetsGroup中的所有ALAsset;
可通过 setAssetsFilter: 设置过滤器( ALssetsFilter )使enumerateAssetsUsingBlock:只返回特定类型asset,而 numberOfAssets 只返回特定类型asset的数量。 ?可以设置只显示Photo( allPhotos ),只显示Video( allVideos ),或显示全部(allAssets )。
enumerateAssetsUsingBlock:为同步方法,只有所有Asset遍历完才返回。所以需要将遍历代码放入背景线程,防止阻塞UI线程。
6.根据url获取asset
使用ALAssetsLibrary的 assetForURL:resultBlock:failureBlock: 方法,可根据之前从ALAssetRepresentation中获取的url重新获取ALAsset对象,此方法同enumerateGroupsWithTypes:usingBlock:failureBlock:一样为异步方法。