一、简介
获取系统相册中数据重要的四个类,他们的关系如下:
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.");
}];
}