注:当你选择看这篇博客时想必你的应用还支持iOS8一下系统,如果你的应用要求最低版本大于iOS8,建议使用PhotoKit框架,效率更高

ALAssetsLibrary包含,ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRepresentation几个类

1、框架解析

(1) ALAssetsLibrary

ALAssetsLibrary类可以实现查看相册列表,增加相册,保存图片到相册等功能

具体实现见框架使用

(2) ALAssetsGroup

ALAssetsGroup就是相册的类,可以通过ALAssetsLibrary遍历得到相册ALAssetsGroup

通过valueForProperty:获取相册名称

[assetsGroup valueForProperty:ALAssetsGroupPropertyName]

ALAssetsGroup 可以使用setAssetsFilter:(ALAssetsFilter *)filter过滤照片或者视频详情见ALAssetsFilter

(3) ALAsset

ALAsset就是一个资源文件,一个ALAssetsGroup下会有多个资源文件,获取相册和视频就是通过ALAssetsLibrary遍历得到相册ALAssetsGroup,

然后通过ALAssetsGroup遍历得到资源文件ALAsset

通过valueForProperty:获取资源文件的信息:

//查看资源的文件类型

[asset valueForProperty:ALAssetPropertyType]

//查看资源的文件类型

[asset valueForProperty:ALAssetPropertyType]

//查看资源的地理位置信息
 [asset valueForProperty:ALAssetPropertyLocation]
 //如果资源是视频,查看视频的时长
  [asset valueForProperty:ALAssetPropertyDuration]
 //查看资源的方向,图片的旋转方向
 [asset valueForProperty:ALAssetPropertyOrientation]
  //查看资源的创建时间
 [asset valueForProperty:ALAssetPropertyDate]
  //查看资源的描述信息
  [asset valueForProperty:ALAssetPropertyRepresentations]
  //查看资源的url路径
  [asset valueForProperty:ALAssetPropertyAssetURL]

通过 asset.defaultRepresentation 可以获取资源文件的url、size、name等信息

// 获取资源文件url

asset.defaultRepresentation.url

// 获取资源文件大小

asset.defaultRepresentation.size

// 获取资源文件名称

asset.defaultRepresentation.filename

(4) ALAssetsFilter

ALAssetsFilter主要用于过滤图片和视频

通过setAssetsFilter:筛选资源文件

//筛选图片和视频

[group setAssetsFilter:[ALAssetsFilter allAssets]];

//筛选图片

[group setAssetsFilter:[ALAssetsFilter allPhotos]];

//筛选视频

[group setAssetsFilter:[ALAssetsFilter allVideos]];

(5) ALAssetRepresentation

ALAsset类有一个defaultRepresentation方法,返回值是ALAssetRepresentation类,该类的作用就是获取该资源图片的详细资源信息。

通过representation 获取资源文件信息

// //获取资源图片的详细资源信息

ALAssetRepresentation* representation = [asset defaultRepresentation];

//获取资源图片的长宽

CGSize dimension = [representation dimensions];

//获取资源图片的高清图

[representation fullResolutionImage];

//获取资源图片的全屏图

[representation fullScreenImage];

//获取资源图片的名字

NSString* filename = [representation filename]; NSLog(@"filename:%@",filename);

//缩放倍数

[representation scale];

//图片资源容量大小

[representation size];

//图片资源原数据

[representation metadata];

//旋转方向

[representation orientation];

//资源图片url地址,该地址和ALAsset通过ALAssetPropertyAssetURL获取的url地址是一样的

[representation url];

//资源图片uti,唯一标示符

[representation UTI]

2、框架使用

(1)遍历得到图片视频资源

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]

[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll  usingBlock:resultsBlock  failureBlock:nil];

ALAssetsLibraryGroupsEnumerationResultsBlock resultsBlock = ^(ALAssetsGroup *group, BOOL *stop) {

NSString * str = [group valueForProperty:ALAssetsGroupPropertyName];

// 得到相册

if (group){

[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

// 得到资源文件

if (asset) {

NSString *type = [asset valueForProperty:ALAssetPropertyType];

if ([type isEqual:ALAssetTypePhoto] )

{

dispatch_async(dispatch_get_global_queue(0, 0), ^{

[self addAssetWith:asset title:[self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]];

});

self.numberOfPhotos ++;

AddFileSelectModel *assetSelectModel = [[AddFileSelectModel alloc] init];

assetSelectModel.asset = asset;

assetSelectModel.selected = NO;

NSDate *date = [assetSelectModel.asset valueForProperty:ALAssetPropertyDate];

NSTimeInterval time = date.timeIntervalSince1970;

assetSelectModel.date = (NSInteger)time;

NSDateFormatter* formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"yyyy-MM-dd HH:MM:ss"];

NSString *str = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:time]];

NSLog(@"%@",str);

[self.assets addObject:assetSelectModel];

self.assets = [[[self.assets reverseObjectEnumerator] allObjects] mutableCopy];

dispatch_async(dispatch_get_main_queue(), ^{

[self.collectionView reloadData];

});

}

}

}

}];

}

};

(2)在系统相册中创建相册

- (void)createAlbumInPhone

{

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];

NSMutableArray *groups=[[NSMutableArray alloc]init];

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {

if (group) {

[groups addObject:group];

} else {

BOOL haveHDRGroup = NO;

for (ALAssetsGroup *gp in groups) {

NSString *name =[gp valueForProperty:ALAssetsGroupPropertyName];

if ([name isEqualToString:@"联系家庭云"]) {

haveHDRGroup = YES;

}

}

if (!haveHDRGroup) {

[assetsLibrary addAssetsGroupAlbumWithName:@"联系家庭云" resultBlock:^(ALAssetsGroup *group) {

[groups addObject:group];

} failureBlock:nil];

haveHDRGroup = YES;

}

}

};

//创建相簿

[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil];

}

(3)在系统相册中保存图片

- (void)saveImageToAlbum:(UIImage *)image

{

[self saveToAlbumWithMetadata:nil imageData:UIImageJPEGRepresentation(image,1.0) customAlbumName:@"联系家庭云" completionBlock:^{

// 创建成功执行成功代码

} failureBlock:^(NSError *error) {

//处理添加失败的方法显示alert让它回到主线程执行,不然那个框框死活不肯弹出来

dispatch_async(dispatch_get_main_queue(), ^{

//添加失败一般是由用户不允许应用访问相册造成的,这边可以取出这种情况加以判断一下

if([error.localizedDescription rangeOfString:@"User denied access"].location != NSNotFound ||[error.localizedDescription rangeOfString:@"用户拒绝访问"].location!=NSNotFound){

UIAlertView *alert=[[UIAlertView alloc]initWithTitle:error.localizedDescription message:error.localizedFailureReason delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", nil) otherButtonTitles: nil];

[alert show];

}

});

}];

}

- (void)saveToAlbumWithMetadata:(NSDictionary *)metadata imageData:(NSData *)imageData customAlbumName:(NSString *)customAlbumName completionBlock:(void (^)(void))completionBlock failureBlock:(void (^)(NSError *error))failureBlock

{

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];

void (^AddAsset)(ALAssetsLibrary *, NSURL *) = ^(ALAssetsLibrary *assetsLibrary, NSURL *assetURL) {

[assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) {

[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:customAlbumName]) {

[group addAsset:asset];

if (completionBlock) {

completionBlock();

}

}

} failureBlock:^(NSError *error) {

if (failureBlock) {

failureBlock(error);

}

}];

} failureBlock:^(NSError *error) {

if (failureBlock) {

failureBlock(error);

}

}];

};

[assetsLibrary writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error) {

if (customAlbumName) {

[assetsLibrary addAssetsGroupAlbumWithName:customAlbumName resultBlock:^(ALAssetsGroup *group) {

if (group) {

[assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) {

[group addAsset:asset];

if (completionBlock) {

completionBlock();

}

} failureBlock:^(NSError *error) {

if (failureBlock) {

failureBlock(error);

}

}];

} else {

AddAsset(assetsLibrary, assetURL);

}

} failureBlock:^(NSError *error) {

AddAsset(assetsLibrary, assetURL);

}];

} else {

if (completionBlock) {

completionBlock();

}

}

}];

}

iOS开发之获取系统相册ALAssetLibrary的更多相关文章

  1. 李洪强iOS开发-网络新闻获取数据思路回顾

    李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对 ...

  2. iOS开发之获取沙盒路径

    iOS开发之沙盒机制(SandBox)具体解说了沙盒的一些机制.在开发中,我们须要对沙盒进行操作.所以我们须要获取到沙盒路径. 沙盒里的目录包含Documents.Library.tmp.这三个目录的 ...

  3. iOS 获取系统相册数据(不是调系统的相册)

    Framework:AssetsLibrary.framework 主要目的是获取到系统相册的数据,并把系统相册里的照片显示出来. 1.创建一个新的项目: 2.将AssetsLibrary.frame ...

  4. Android 获取系统相册中的所有图片

    Android 提供了API可获取到系统相册中的一些信息,主要还是通过ContentProvider 来获取想要的内容. 代码很简单,只要熟悉ContentProvider 就可以了. public ...

  5. iOS开发中获取WiFi相关信息

    iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可能是与WiFi相关的. 1.Ping域名.Ping某IP 有 时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作.这里的p ...

  6. iOS开发中获取视图在屏幕上显示的位置

    在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...

  7. Android开发之获取系统版本号

    获取系统版本号:获取当前系统的版本号: textView.setText("Product Model: " + android.os.Build.MODEL + ",& ...

  8. Android开发之获取系统所有进程信息。

    最近在做一个app,有一个进程管理模块用于管理系统中正在运行的进程,并且可以关闭进程进行加速手机的功能,基本把它实现了出来.界面的效果都是自己写的,虽然有BUG,但是基本上能满足需求,后期我会改进BU ...

  9. iOS中获取系统相册中的图片

    一.获取单张图片 思路: 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片 2.设置代理,遵守代理协议 注意这个UIImagePickerContr ...

随机推荐

  1. 【MySQL】谈谈PhxSQL的设计和实现哲学

    参考资料: http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483790&idx=1&sn=c925202df ...

  2. Elasticsearch教程(二),IK分词器安装

    elasticsearch-analysis-ik  是一款中文的分词插件,支持自定义词库,也有默认的词库. 开始安装. 1.下载 下载地址为:https://github.com/medcl/ela ...

  3. 【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线

    一.段的类型: 1.什么是段:段是存储单元. 1.段的类型有: 表 分区表 簇表 索引 索引组织表(IOT表) 分区索引 暂时段 undo段 lob段(blob ,clob) 内嵌表(record类型 ...

  4. Node.js node主文件找不到时报出的Error:Cannot find module异常

    如果执行>Node xx.js时,xx,js找不到的话,报出的错误是Error:Cannot find module 'c:/test/xx,js' 主文件名打错或者是点号打成逗号都会出这样的错 ...

  5. java学习笔记——可用链表

    NO 链表方法名称 描述 1 public void add(数据类型 对象) 向链表中增加数据 2 public int size() 查看链表中数据个数 3 public boolean isEm ...

  6. Angular 学习笔记——$interpolateProvide

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  7. 单一按钮显示/隐藏&&提示框效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. AnimatorStateInfo

    AnimatorStateInfo Namespace: UnityEngine   Description Information about the current or next state. ...

  9. SQL SERVER 使用订阅发布同步数据库(转)

    一.数据库复制涉及  1.发布服务器:  数据的来源服务器,维护源数据,决定哪些数据将被分发,检测哪些数据发生了修改,并将这些信息提交给分发服务器.  2.分发服务器: 分发服务器负责把从发布服务器拿 ...

  10. ios网络学习------10 原生API文件上传

    使用原生态的api上传文件的实现: #import "MainViewController.h" @interface MainViewController () @propert ...