代码中怎么新建一个相簿?

转载自:http://www.cocoachina.com/bbs/read.php?tid=143383

我的创建相册代码:

- (void)saveToAlbumWithMetadata:(NSDictionary*)metadata
                      imageData:(NSData*)imageData
                customAlbumName:(NSString*)customAlbumName
                completionBlock:(void(^)(void))completionBlock
                   failureBlock:(void(^)(NSError*error))failureBlock
{
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];    //接下来是疯狂的 block
    void(^AddAsset)(ALAssetsLibrary *, NSURL*) = ^(ALAssetsLibrary *assetsLibrary, NSURL*assetURL) {        //1 遍历 AssetsLibrary 整个相册库
        [assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) {       //2 遍历 ALAssetsGroup 相册库中文件夹
            [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL*stop) {                //3 找到 customAlbumName 对应的相册库文件夹
                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();
            }
        }
    }];

}

- (void)saveImage:(UIImage*)image{
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    NSMutableArray*groups=[[NSMutableArrayalloc]init];
    ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL*stop)
    {
        if(group)
        {
            [groups addObject:group];
        }
        else
        {
            BOOLhaveHDRGroup = NO;

            for(ALAssetsGroup *gp in groups)
            {
                NSString*name =[gp valueForProperty:ALAssetsGroupPropertyName];

                if([name isEqualToString:@"Flickr墙纸"])
                {
                    haveHDRGroup = YES;
                }
            }

            if(!haveHDRGroup)
            {
                //do add a group named "HDR"
                [assetsLibrary addAssetsGroupAlbumWithName:@"Flickr墙纸"
                                               resultBlock:^(ALAssetsGroup *group)
                 {
                     [groups addObject:group];

                 }
                                              failureBlock:nil];
                haveHDRGroup = YES;
            }
        }

    };
    //创建相簿
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil];

//在我的"扫一扫"代码中,生成的二维码图片存到新创建的相薄后显示全黑,后同事指点原来是下边红色方法的问题,后换了个方法实现了:
UIImageJPEGRepresentation(image,1)
    [self saveToAlbumWithMetadata:nilimageData:UIImagePNGRepresentation(image) customAlbumName:@"Flickr墙纸"completionBlock:^
    {
        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"保存成功"message:@"若想马上启用该墙纸,请进入图库找到该墙纸并设置为墙纸即可,感谢您的使用。"delegate:nilcancelButtonTitle:@"好"otherButtonTitles: nil];
        [alert show];

    } failureBlock:^(NSError*error)
    {
        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"保存失败"message:error.description delegate:nilcancelButtonTitle:@"知道了"otherButtonTitles: nil];
        [alert show];

//面这个方法可判断是否是因为用户拒绝访问地址所致,如果是中文环境返回 的是“用户拒绝访问”
if (([myerror.localizedDescription rangeOfString:@"User denied access"].location!=NSNotFound )|| ([myerror.localizedDescription rangeOfString:@"用户拒绝访问"].location!=NSNotFound))
    }];

}
时间: 2024-08-11 02:11:21

代码中怎么新建一个相簿?的相关文章

Eclipse中在android项目中出现新建一个Activity后,出现整个工程的报错以及包导入以后无法运行等等情况分析。

今天用Eclipse去写android项目,然后后面需要建一个Blank  Activity后,很正常的建立的,然后那个Activity是基于ActionBarAtivity,要导入v7,结果因为这个v7的原因,导致原来的导入包不见了,而且重新导入的时候,虽然工程开启没有报错误,但是接下来在运行的时候,结果运行不了,Logcat出现Classnotfound,但是之前的工程一点事都有.折磨了半天,终于发现错误所在,兼容性问题就不说了,说一下应该怎么解决这样的报错.那就是在新建的时候,你新建一个E

Eclipse中在android项目中出现新建一个Activity后,出现整个project的报错以及包导入以后无法执行等等情况分析。

今天用Eclipse去写android项目,然后后面须要建一个Blank  Activity后,非常正常的建立的.然后那个Activity是基于ActionBarAtivity,要导入v7,结果由于这个v7的原因,导致原来的导入包不见了.并且又一次导入的时候,尽管project开启没有报错误,可是接下来在执行的时候,结果执行不了.Logcat出现Classnotfound,可是之前的project一点事都有.折磨了半天,最终发现错误所在,兼容性问题就不说了,说一下应该怎么解决这种报错.那就是在新

Windows Store App 全球化:在后台代码中引用字符串资源

上文提到了引用字符串资源具有两种方式,分别是在XAML元素中和在后台代码中引用资源文件中的字符串资源.在第一小节已经介绍了如何在XAML元素中引用字符串资源,本小节将讲解在后台代码中引用字符串资源的相关知识点. 下面通过一个示例直接讲述如何在后台代码中引用资源文件中的字符串资源.新建一个Windows应用商店的空白应用程序项目,并命名为StringResourcesInCode.在项目中新建一个名为"Strings"的文件夹,在"Strings"文件夹下新建名为&q

Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握hand

Sharepoint2010新建一个用户的方法

最近在做关于SharePoint的相关开发,在开发中需要用到测试用户进行相关权限的测试,所以就需要创建一个新的用户进行,但是在网上找了很久都没有找到关于创建一个新用户的资料,最后终于在http://www.sharepointmonitor.com上找到了相关资料.具体的步骤如下: 1.打开计算机管理,在本地用户和组上新建一个用户: 创建成功就会在本地用户和组上显示这个用户: 2.打开网站的前端服务器,在网站设置中的用户和权限中选择人员和组这一项,然后在你选择的组中选择新建一个用户,填写你刚刚新

iOS中如何创建一个滑出式导航面板(1)

本文将介绍如何创建类似Facebook和Path iOS程序中的滑出式导航面板. 向右滑动 滑出式设计模式可以让开发者在程序中添加常用的导航功能,又不会浪费屏幕上宝贵的空间.用户可以在任意时间滑出导航面板,并且还可以看到当前屏幕上显示的内容. 现在,互联网上有些库已经内置滑出式设计模式,比如John-Lluch开发的SWRevealViewController.如果你在寻找更加快捷和简单的方法,那么使用SWRevealViewController库可能是一个很不错的方法. 不过,如果你是一名DI

【转】 C#中Finally的一个不太常见的用法

原文地址:http://www.cnblogs.com/listhome/p/3664300.html 最近在看.net BCL 传送门 的源码. 在 System.Collections.Concurrent.ConcurrentQueue 中看到一段有意思的代码.注意这段代码是写在ConcurrentQueue这个用于并发中的队列. 注意,这是一个无锁队列的实现. try { } finally { newhigh = Interlocked.Increment(refm_high); if

参考_Android中,如何新建一个界面,并且实现从当前界面切换到到刚才新建的(另外一个)界面

参考地址: http://www.crifan.com/android_how_to_create_new_ui_and_switch_to_another_new_ui/ 想要实现,在Android的ADT开发环境中, 在当前界面下,新建一个新的界面,然后从当前界面,切换到新建界面中. 其中: 1. 当前界面是主界面,对应的布局的xml文件是activity_main.xml 2.新建的一个界面,主要适用于实现文件夹浏览方面的功能. 前提知识 Activity Android中,对于界面的控制

分针网—IT教育:nodeJS新建一个项目及代码详解

有了解nodejs的童鞋们知道,nodejs有很多的依赖,那么我们在新建一个项目的时候,如何快速的导入这些依赖从而创建一个nodejs项目呢,接下来会详细介绍. 这里安利一个前端开发工具--webstorm.真的很好用,除了有点(或许不是一点点)占内存,打开的时候有点慢.在工作中用这个会很方便(在考虑要不要写一篇前端开发工具的比较,吼吼吼~(≧▽≦)/~) ?下面我们来用命令创建一个nodejs项目. 1.我们在c盘的ws文件夹下创建项目. 打开DOS窗口,进入到ws文件夹 2.在此文件夹下创建