设备中创建新相册(粘贴)

二:在手机相册(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();

}

}

}];

}

三、ALAssetsLibraryALAssetsGroup、ALAsset 介绍

1、ALAssetsLibrary

ALAssetsLibrary提供了我们对iOS设备中的相片、视频的访问。它是连接了我们应用程序和相册之间的访问的一个桥梁。

2、ALAssetsGroup

指代一个相册。

3、ALAsset

每一个ALAsset代表一个单一资源文件(也就是一张图片,或者一个视频文件)

4、ALAssetRepresentation

ALAssetRepresentation封装了ALAsset,包含了一个资源文件中的很多属性。(可以说是ALAsset的不同的表示方式,本质上都表示同一个资源文件)

时间: 2024-11-02 10:13:20

设备中创建新相册(粘贴)的相关文章

EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型

官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新的数据库,我们首先在appsettings.json文件夹中,使用json对来给出mysql数据库连接语句,其次在 Startup.cs中使用MySql的中间价来注入MySql服务,在这里,我使用的MySql驱动是Pomelo.EntityFramoworkCore.MySql.新建一个类,用来做数

如何在HiWork中创建新频道及加入已有频道

周四,下午,天气很热,空气火热地快要化了,注意防晒. 今天来说说在HiWork中如何创建新频道,或者加入已有频道,明天会介绍如何创建新的讨论组及邀请成员加入讨论组. 可能有人会问,频道和讨论组到底有什么区别呢? 频道是个公共的话题组,团队中的所有成员通过搜索都可主动加入任意频道,或由其他团队成员邀请加入.每个成员左边显示的频道都是已经加入的频道,没有加入的不显示. 讨论组是私密的话题组,只有参与者能看到.成员无法主动加入讨论组,只能由讨论组中的组员邀请才能加入.另外,讨论组中的消息具有私密性,只

Eclipse中创建新的Spring Boot项目

简单几步,在Eclipse中创建一个新的Spring Boot项目: 1.Eclipse中安装STS插件: Help -> Eclipse Marketplace... Search或选择"Popular"标签,选择Spring Tool Suite (STS) for Eclipse插件,安装: 2.New -> Project... 找到Spring目录,选择Spring Starter Project,Next 3.填写跟项目相关的各种信息,然后Next: 4.选择需

Linux中创建新用户并赋给指定文件权限

工作中用到了,写篇日志总结一下. 创建新的用户: 第一种方式: 创建用户: adduser name 创建密码: passwd name(回车后出现修改密码的提示) 该方式创建的用户目录默认在home下. 第二种方式: useradd -d /usr/disp -m passwd 该方法可以在创建用户时制定该用户的根路径和密码. 通过这种方式创建的用户可以使用ssh登录,但只有只读权限可以浏览下载部分文件无法写和修改. 将该用户加入用户组: useradd -g idsp1 -n idsp 添加

Eclipse中创建新的SpringBoot项目(打包并且部署到tomcat)

Spring-boot因为其对jar包的高度集成以及简化服务配置,快速部署等的优点,逐渐成为Java开发人员的热衷的框架.下面演示一下怎么在Eclipse中新建Spring-boot项目以及打包部署. 在Eclipse中创建Spring-boot有两种方式 方式一 进入Spring-boot的在线配置网站http://start.spring.io/:定制自己的项目服务组件,下载到本地并使用Eclipse导入项目 服务组件: Web:web项目组件,包含spring mvc,tomcat,log

在子线程中创建新的窗体,遇到的问题。

场景: 服务端的应用程序创建了一个线程来接收客户端发来的消息,当接收到消息后,需要弹出一个新的窗体,作为响应操作等. 现象: 新创建的窗体呈现挂起.假死,或者一闪而过的现象. 原因: 新创建的响应窗体是由子线程创建的,而.net平台下,子线程执行完毕后,会自动释放资源,同样的,这个新创建的窗体也会被释放掉.若是这个线程处于监听或者一些其他的连续执行状态,那么,这个窗体就会出现假死状态. 解决方案: 可以在子线程中调用一个代码段,而这个代码段通过invoke方法回答主线程中去创建和现实Form2,

在 iTunes content中创建新的版本时,出现构建版本后面没有加号。

老项目升级时,提交版本时,ipa已经上传成功到APP store,但是构建版本后面一直都没有加号,等了一夜还是没有反应 后来苹果发来一封邮件,意思是,我需要在plist文件中添加一个NSMicrophoneUsageDescription关键字符串值向用户解释应用程序如何使用这些数据. 还需要在 capabilities -> Push Notifications 勾选上,如果你的项目需要推送的话. 修改完后,项目就可以上传构建新版本了. 点击加号后,可以看到上个构建的版本是个无效版本. 有点奇

代码中创建新终端 以及的把新终端的输出打印到文件,用于调式。

转自:http://blog.chinaunix.net/uid-20682147-id-4981769.html cat term.c #include<stdio.h> #include<stdbool.h> #include<stdlib.h> #include<string.h> #include<sys/prctl.h> #include<unistd.h> #include<utmp.h> #include&l

Linux中创建新用户并赋予指定目录的相关权限

1 创建用户且指定该用户的根路径和密码 useradd -d /home/mydir -m username 这种方式创建的用户可以使用ssh登录,但只有只读权限可以浏览下载部分文件无法写和修改.建议通过将用户加入一个组来获得指定路径的权限. 2 设置密码 passwd username 3 用户授权 chown -R username: username /home/ mydir chmod 755 /home/mydir 4 将用户加入到组 将一个用户添加到用户组中,尽量不要直接用(除非确实