iOS开发之获取系统相册ALAssetLibrary
注:当你选择看这篇博客时想必你的应用还支持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的更多相关文章
- 李洪强iOS开发-网络新闻获取数据思路回顾
李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据 1.1 定义类方法返回单例对 ...
- iOS开发之获取沙盒路径
iOS开发之沙盒机制(SandBox)具体解说了沙盒的一些机制.在开发中,我们须要对沙盒进行操作.所以我们须要获取到沙盒路径. 沙盒里的目录包含Documents.Library.tmp.这三个目录的 ...
- iOS 获取系统相册数据(不是调系统的相册)
Framework:AssetsLibrary.framework 主要目的是获取到系统相册的数据,并把系统相册里的照片显示出来. 1.创建一个新的项目: 2.将AssetsLibrary.frame ...
- Android 获取系统相册中的所有图片
Android 提供了API可获取到系统相册中的一些信息,主要还是通过ContentProvider 来获取想要的内容. 代码很简单,只要熟悉ContentProvider 就可以了. public ...
- iOS开发中获取WiFi相关信息
iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可能是与WiFi相关的. 1.Ping域名.Ping某IP 有 时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作.这里的p ...
- iOS开发中获取视图在屏幕上显示的位置
在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...
- Android开发之获取系统版本号
获取系统版本号:获取当前系统的版本号: textView.setText("Product Model: " + android.os.Build.MODEL + ",& ...
- Android开发之获取系统所有进程信息。
最近在做一个app,有一个进程管理模块用于管理系统中正在运行的进程,并且可以关闭进程进行加速手机的功能,基本把它实现了出来.界面的效果都是自己写的,虽然有BUG,但是基本上能满足需求,后期我会改进BU ...
- iOS中获取系统相册中的图片
一.获取单张图片 思路: 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片 2.设置代理,遵守代理协议 注意这个UIImagePickerContr ...
随机推荐
- VB程序无法运行,Component ‘MCI32.OCX’错误怎么办
1 提示Component 'MCI32.OCX'错误 2 搜索你电脑的MCI32.OCX这个文件 3 把它复制到任意位置,然后再同一个目录下新建一个文本文档,输入regsvr32 MCI32 ...
- [PIC32--IDE]使用MPLAB IDE调试
问题描写叙述 安装好MPLAB IDE后,就能够用来调试自己的PIC32板子,用于应用的开发了. 开发板 手边使用的是Microchip的PIC32 Ethernet Starter Kit II的小 ...
- Oracle基础 触发器
一.触发器 触发器是当特定事件出现时自动执行的代码块.比如,每次对员工表进行增删改的操作时,向日志表中添加一条记录.触发器和存储过程是由区别的:触发器是根据某些条件自动执行的,存储过程是手动条用的. ...
- eclispe查看jdk源码后特别卡顿导致未响应解决
第一步:Eclipse -> Preferences -> General -> Startup and Shutdown.不要勾选 RSE UI. 第二步:Eclipse -> ...
- .net 定时服务
namespace MvcApplication1 { public class MvcApplication : System.Web.HttpApplication { protected voi ...
- Ubuntu 下修改 Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
在Ubuntu上安装Apache,每次重启,都会出现以下错误提示: Could not reliably determine the server’s fully qualified domain n ...
- C#常见的概念阐述
在上篇文章中,你跟着我写了一个HelloWorld,本篇中,我们来谈谈一些C#程序中的小概念 1.C# 程序结构 一个 C# 程序主要包括以下部分: 命名空间声明(Namespace declarat ...
- Delphi 数据类型列表
分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 2147483647 4 有符号32位 Cardinal 0 .. 4294967295 4 无符号32位 ...
- nightwatch-js ----并发运行
从v0.5开始nightwatch支持并发测试.通过在命令行中指定多个环境来工作,用逗号分隔.例如: $ nightwatch -e default,chrome 这样可以在多个相同或是不同的浏览器上 ...
- css写箭头
/* 向上的箭头 */ .dot-top { font-size: 0; line-height: 0; border-width: 10px; border-color: red; border-t ...