一、简介
获取系统相册中数据重要的四个类,他们的关系如下:
ALAssetsLibrary -> ALAssetsGroup -> ALAsset -> ALAssetRepresentation
a、ALAssetsLibrary
初始化一个ALAssetsLibrary对象,我们可以读取所有相关数据,也就是能访问到相册列表了。
b、ALAssetsGroup
我们在访问系统相册,基本上都是使用的遍历的形式得到我们所需。当我们初始化好ALAssetsLibrary对象后,设置遍历类型为ALAssetsGroupAll时,这个过程中我们可以拿到对应相册列表的信息,比如相册列表的名字等。
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init]; //生成整个photolibrary实例//在此遍历的是所有的东西[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop)
当使用ALAssetsGroupSavedPhotos方式对系统相册进行遍历是,打印group并没有获取到对应的分组信息。但使用ALAssetsGroupAll遍历时能得到相册列表的名称。所以遍历方式不一样,会影响到ALAssetsGroup中的相关属性的值。
当其对ALAsset操作时,可以设置许多的东西:
三种遍历方式//按顺便遍历获取相册中所有的资源enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) //可以指定顺序遍历所有资源 ,并指定资源 enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:0] options:NSEnumerationConcurrent usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {//遍历所有的资源,遍历顺序可以是先序或倒序enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 筛选,在此可以指定我们想要的媒体类型文件– setAssetsFilter: 筛选器– numberOfAssets 返回个数,但如果是删选条件下,则返回筛选剩余组的一些属性信息– valueForProperty:(通过组属性名称,获取组属性:组名称,组类型,组永久性ID,组URL)– posterImage(组的封面)– addAsset:
c、ALAsset
拿到对应的组ALAssetsGroup对象以后,它里面可能包含多个ALAsset对象,通过它可以得到以下东西:
ALAssetPropertyAssetURL 文件的url ALAssetPropertyType 那种类型的文件ALAssetPropertyLocation 资源地理位置(无位置信息返回null)ALAssetPropertyDuation 时长ALAssetPropertyOrientation 8个方向方向ALAssetPropertyDate 精确到秒的拍摄时间ALAssetPropertyURLs 一个字典,键值分别是文件名和文件的url路径editable property 能否编辑originalAsset property 原始资源
d、ALAssetRepresentation
从ALAssetRepresentation可以拿到一些具体的信息,比如照片的缩略图,原始图,URL,Size,方向、名字。
//得到相册中的视频文件的url- (void)getImageAndVidoeFormLibrary { ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init]; //生成整个photolibrary实例 __block NSInteger v=0; __block NSInteger p; __block NSInteger g=0; self.imageMA = [NSMutableArray array]; self.imageForViduo = [NSMutableArray array]; NSMutableArray *assetURLDictionaries = [NSMutableArray array]; [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { NSLog(@"ALAssetsGroupSavedPhotos===%@",group); NSString* groupname = [group valueForProperty:ALAssetsGroupPropertyName]; NSLog(@"groupname--%@",groupname); //对组进行遍历,筛选分类 [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { NSString* type = [result valueForProperty:ALAssetPropertyType]; if ([type isEqualToString:ALAssetTypePhoto]) { //图片 }else if([type isEqualToString:ALAssetTypeVideo]){ //保存视频URL NSLog(@"ALAssetTypeVideo-----%ld",++v); ALAssetRepresentation *representation = [result defaultRepresentation]; NSURL *url = [representation url]; NSLog(@"%@",url); [self.imageMA addObject:url]; [self generateIamgeForViodeWithURL:url]; //下面注释是一个获取到视频并将其写入指定位置方法 // long long size = representation.size; // NSMutableData* data = [[NSMutableData alloc] initWithCapacity:size]; // void* buffer = [data mutableBytes]; // [representation getBytes:buffer fromOffset:0 length:size error:nil]; // NSData *fileData = [[NSData alloc] initWithBytes:buffer length:size]; // // // NSDate * senddate=[NSDate date]; // // NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init]; // // [dateformatter setDateFormat:@"YYYYMMdd"]; // // NSString * locationString=[dateformatter stringFromDate:senddate]; // // //File URL // NSString *savePath = [NSString stringWithFormat:@"%@%@", [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"%@",locationString]], representation.filename]; // [[NSFileManager defaultManager] removeItemAtPath:savePath error:nil]; // // // // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { // [fileData writeToFile:savePath atomically:NO]; // // }); }else if([type isEqualToString:ALAssetTypeUnknown]){ NSLog(@"Unknow AssetType"); } }]; } failureBlock:^(NSError *error) { NSLog(@"Enumerate the asset groups failed."); }]; }