一、简介

获取系统相册中数据重要的四个类,他们的关系如下:

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.");
    }];
    
}