在手机相册(ios设备相册)中创建相册
目录[-]
- 一:添加照片到相册中(不在ios设备的相册中创建相册)
- 二:在手机相册(ios设备相册)中创建相册
- 第一步:向工程里添加AssetsLibrary 库文件
- 第二步:在项目中"import" 导入库(在哪用就在哪导入)
- 核心代码
- 三、ALAssetsLibrary、ALAssetsGroup、ALAsset 介绍
- 1、ALAssetsLibrary
- 2、ALAssetsGroup
- 3、ALAsset
- 4、ALAssetRepresentation
这篇博客的主要内容来源于cocoachina 里的贴子,代码能实现在在手机相册(ios设备相册)中创建相册的功能。
原文地址:http://www.cocoachina.com/bbs/read.php?tid=143383
一:添加照片到相册中(不在ios设备的相册中创建相册)
使用代码
1
|
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
|
使用这句话就能把图片存入照片中了
二:在手机相册(ios设备相册)中创建相册
第一步:向工程里添加AssetsLibrary 库文件
第二步:在项目中"import" 导入库(在哪用就在哪导入)
1
|
#import <AssetsLibrary/AssetsLibrary.h>
|
核心代码
在需要添加相册的地方调用代码
1
2
3
4
5
6
|
//添加到相册我让它执行是异步执行的方式,如果不想用这种方式,可以不去开一个线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self createAlbumInPhoneAlbum];
});
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#pragma mark - 在手机相册中创建相册
- ( void )createAlbumInPhoneAlbum
{
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)
{
//do add a group named "XXXX"
[assetsLibrary addAssetsGroupAlbumWithName:@ "相册名字"
resultBlock:^(ALAssetsGroup *group)
{
[groups addObject:group];
}
failureBlock:nil];
haveHDRGroup = YES;
}
}
};
//创建相簿
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil];
[self saveToAlbumWithMetadata:nil imageData:UIImagePNGRepresentation(self.imageView.image) 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];
[alert release];
}
});
}];
}
- ( 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();
}
}
}];
}
|
三、ALAssetsLibrary、ALAssetsGroup、ALAsset 介绍
1、ALAssetsLibrary
ALAssetsLibrary提供了我们对iOS设备中的相片、视频的访问。它是连接了我们应用程序和相册之间的访问的一个桥梁。
2、ALAssetsGroup
指代一个相册。
3、ALAsset
每一个ALAsset代表一个单一资源文件(也就是一张图片,或者一个视频文件)
4、ALAssetRepresentation
ALAssetRepresentation封装了ALAsset,包含了一个资源文件中的很多属性。(可以说是ALAsset的不同的表示方式,本质上都表示同一个资源文件)
在手机相册(ios设备相册)中创建相册相关推荐
- Linux设备驱动程序中创建线程的方法
参考博客文章来源:https://blog.csdn.net/ezimu/article/details/60467017 第一种方法:kernel_thread #include <linux ...
- html5 调用系统相册,iOS之H5调用系统相册相机浏览文件
在我们iOS开发中大家遇到过H5和原生交互,需要上传文件,刚开始的思路肯定是在之前轻车熟路的js交互中原生方法获取文件之后上传,今天我们了解一个新的方法,其实苹果官方给我们提供了一个更简单的方法, H ...
- Android实现自定义相册,在Android Gallery App中创建自定义相册
您可以使用这种方式在Gallery应用中创建相册.该名称显示为"app images". String path = Environment.getExternalStorageD ...
- c语言保存图片image,iOS 保存图片到【自定义相册】
3.1.Photos 框架基本认识,我们可以在 Help->Developer Documentation-> 选择OC或者Swift 搜索 Photos Photos 框架检索 Phot ...
- 教程:手机数据恢复 安卓设备内置存储器创建镜像到电脑数据恢复
教程:手机数据恢复 安卓设备内置存储器创建镜像到电脑数据恢复 2014-7-17 10:59| 发布者: 蝴蝶| 查看: 20538| 评论: 7|原作者: 330wang|来自: INTOHARD独 ...
- 【苹果相册推】Xcode项目,我们将其命名为mypushchat,以及调试的iOS设备
推荐内容IMESSGAE相关 作者✈️@IMEAX推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者✈️@IMEAX推荐内容 1.家庭推内容 *** 点击即可查看作者要求 ...
- 手机邮箱看不到已发送邮件_iPhone用户请注意:你的邮件App得禁用,刚曝光的安全漏洞,iOS 6以上设备全中招...
晓查 白交 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你的iPhone不安全,就算静静地躺在那里也不安全. 最新曝光,来自国外安全团队ZecOps公布了一个惊天大漏洞,估测涉及5亿用户. ...
- 华为手机8.0.0怎么找到云相册_华为G9怎么找到云相册_失而复得 华为“查找手机”功能有多强大?快来了解一下......
[手机中国新闻]人生有三大幸事:虚惊一尝久别重逢.失而复得.手机作为我们日常生活中不可或缺的重要工具,几乎是每个人每天的必备品.但每天在全世界都有千千万万人,因为种种原因,将他们的手机丢失.由于手机是 ...
- Unity与IOS交互,调用相机相册,兼容ipad
IOS篇 在处理unity和ios的时候,除了对oc不太习惯以外,还有就是iphone和ipad有些方法需要做区别.比如通用的弹窗方法不用,以及ipad上打开相册竟然可以支持显示的相册不是全屏了!好吧 ...
- Ionic2中的相册选择和拍照上传——ImgService
目录 目录 前言 Cordova准备 ImgService服务的实现 ImgService服务的使用 示例效果 相册选择器的汉化 参考 前言 在APP中启动相册选择器或者拍照上传图片这些功能是非常常见 ...
最新文章
- 【题解】P1508 Likecloud-吃、吃、吃(简单DP)
- 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
- IDEA统一设置编码为utf-8编码及tomcat 乱码问题的解决
- python实战===图片转换为字符的源码(转)
- 开头th_是什么文件_Python文件读写最详细的讲解
- setResult详解
- 【华为云技术分享】云小课 | SAP S/4HANA高可用之实战演练
- [Java] 1001. 害死人不偿命的(3n+1)猜想 (15)-PAT乙级
- 七十首绝对好听的冷门歌曲(转)
- Python学习笔记—— 面向对象4.类属性、类方法、静态方法
- 笔记本电脑连接加密无线路由器。
- NEON Intrinsics 练习题
- 东北大学计算机学院生产实习,东北大学生产实习报告.doc
- C++:Leetcode-滑动窗口-904.水果成篮
- 华为防火墙配置流量根据链路权重负载分担
- Ardiuno智能电蚊拍
- MAX17043锂电池电量测量芯片C51驱动
- 纽约大学计算机博士奖学金如何,斑马博士捷报|纽约大学(NYU) MS Computer Engineering录取+7000美金奖学金!...
- 首席商学院新媒体运营黎想:抖音直播入门教学,点这!
- 会PLC也能玩转机器视觉(二)- 条码识别
热门文章
- 1436 旅行终点站
- 查看nvidia gpu共享内存大小
- 服务器视频文件外链,视频图床 视频外链网站 视频上传外链分享
- Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
- 触摸屏与TSC2005触摸屏控制器
- xp系统打印机服务器win7连接不了,xp连不上win7的打印机,win7连接打印机
- Redis总结笔记(总结自Redis开发与运维)
- 苹果开发者账户续费 支付授权失败
- 软考嵌入式系统设计师2013年上午试题总结
- 检查型异常有哪些java_JAVA系列之检查型异常与非检查型异常的详解