ios8使用ALAssetsLibrar创建单独文件夹方法以及删除文件夹闪退的bug

在ios8以下的系统创建新相册,然后在相册中手动删除了这个"琳小兮"相册,再使用下面的代码重新创建"琳小兮"相册是没有问题的:

 [assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮"
                                               resultBlock:^(ALAssetsGroup *group)
                 {
                     [groups addObject:group];
                 }
                                              failureBlock:nil];

ios8+ 包含ios8系统,在创建的时候用上面的代码则会崩溃,需要额外添加Photos.framework框架,并导入头文件#import <Photos/Photos.h>,主要修改的代码部分是把上面那段代码做如下修改:

  [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
                 {
                     [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"琳小兮"];
                 } completionHandler:^(BOOL success, NSError *error)
                 {
                     if (!success) {
                         NSLog(@"---error:%@",error.userInfo);
                     }
                 }];

下面是完整的demo,结合了网上的实例写的,给大家做一个参考:

1.添加AssetsLibrary.framework 和 Photos.framework框架

2.导入头文件

#import <AssetsLibrary/AssetsLibrary.h>

#import <Photos/Photos.h>

3.创建全局 UIImageView *_imageV;

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    _imageV = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    _imageV.image = [UIImage imageNamed:@"name.png"];
    [self.view addSubview:_imageV];

    [self createAlbumInPhoneAlbum];
}

#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)
            {
                //添加一个新的相册
                //此方法在ios8.0系统上,之前用代码创建的相册,手动删除它,再用这个库去创建刚被删除的相册,这个时候方法回调是不会跑fail模块的,它走的是正常流程,但是带回来的group却是nil
//                [assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮"
//                                               resultBlock:^(ALAssetsGroup *group)
//                 {
//                     NSLog(@"--------%@",group);
//                     [groups addObject:group];
//                 }
//                                              failureBlock:nil];

                //为了解决iOS8.0以上系统下无法通过代码创建被删除过的同名相册
                [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
                 {
                     [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"琳小兮"];
                     
                 } completionHandler:^(BOOL success, NSError *error)
                 {
                     if (!success) {
                         NSLog(@"---error:%@",error.userInfo);
                     }
                 }];
                
                haveHDRGroup = YES;
            }
        }
        
    };
    
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil];
    
    [self saveToAlbumWithMetadata:nil imageData:UIImagePNGRepresentation(_imageV.image) customAlbumName:@"北企星" completionBlock:^
     {
         //这里可以创建添加成功的方法
         NSLog(@"-------新相册创建成功!!");
     }
                     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();
            }
        }
    }];
}
时间: 2024-12-17 06:35:38

ios8使用ALAssetsLibrar创建单独文件夹方法以及删除文件夹闪退的bug的相关文章

SVN服务器中可以删除文件夹但无法删除文件

SVN服务器中可以删除文件夹但无法删除文件:解决办法 找到任一台连接SVN的电脑客户端,然后打开TortoiseSVN Browser,打开以后输入正确的URL,如图所示: 输入正确的身份验证信息后,在文件目录中找到对应的文件 找到该文件,右键会出现X删除,直接删除即可. 出现该问题的原因:SVN不允许在服务器端删除客户端上传的单一文件,除非将整个工程删除.如果想要删除某个文件,只能通过URL访问到后,进行删除.

[sharepoint]rest api文档库文件上传,下载,拷贝,剪切,删除文件,创建文件夹,修改文件夹属性,删除文件夹,获取文档列表

写在前面 最近对文档库的知识点进行了整理,也就有了这篇文章,当时查找这些接口,并用在实践中,确实废了一些功夫,也为了让更多的人走更少的弯路. 系列文章 sharepoint环境安装过程中几点需要注意的地方 Rest API的简单应用 rest api方式实现对文档库的管理 通过WebClient模拟post上传文件到服务器 WebHttpRequest在sharepoint文档库中的使用 [sharepoint]Rest api相关知识(转) [sharepoint]根据用户名获取该用户的权限

【Android笔记】Android统计文件夹大小,删除文件夹下的所有文件方法

1.获取文件夹大小: 1 /** 2 * 获取文件夹大小 3 * @param file File实例 4 * @return long 5 */ 6 public static long getFolderSize(java.io.File file){ 7 8 long size = 0; 9 try { 10 java.io.File[] fileList = file.listFiles(); 11 for (int i = 0; i < fileList.length; i++) 12

Android得到SD卡文件夹大小以及删除文件夹操作

float cacheSize = dirSize(new File(Environment.getExternalStorageDirectory() + AppConstants.APP_CACHE_FOLDER)) / 1024.0f / 1024.0f; tvCacheSize.setText(((int) (cacheSize * 100)) / 100.0f + "M"); /** * Return the size of a directory in bytes */ p

Delphi的移动文件方法(转)/删除文件:/文件的复制

RenameFile,DeleteFile,MoveFile Delphi的移动文件方法 uses  ShellApi; procedure ShellFileOperation(fromFile: string; toFile: string; Flags: Integer);var  shellinfo: TSHFileOpStructA;begin   with shellinfo do   begin    wnd    := Application.Handle;     wFunc

Linux内核驱动将多个C文件编译成一个ko文件的方法——每个C文件里都有module_init与module_exit

以两个C文件为例: 将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c.adc_driver.c编译成一个ko文件! 采用方法: 第一步.修改C文件 1.去掉adc_device.c文件里module_init(xxx).module_exit(yyy)中xxx.yyy 函数原型的关键字static 2.注销adc_device.c文件里module_init(xxx).module_exit(yyy)函数 3.在adc_driver.c文件里添加

python根据文件目录、文件类型和文件与当前时间差删除文件

直接贴代码: #!/usr/bin/python # -*- coding: gbk -*- import os import datetime import re def deleteFile(base_dir,days,file_ype): now_time = datetime.datetime.now() #获取当前时间 os.chdir(base_dir) #切换到此目录 cwd = os.getcwd() #得到当前目录 files = os.listdir(os.getcwd())

python 判断文件是否存在和删除文件的api (其中判断文件在不在让想起这个可以强兼容jenkins工作目录那个问题)

判断文件在不在的api: os即operating system(操作系统),Python 的 os 模块封装了常见的文件和目录操作. os.path模块主要用于文件的属性获取,exists是“存在”的意思,所以顾名思义,os.path.exists()就是判断括号里的文件是否存在的意思,括号内的可以是文件路径. 举个栗子: user.py为存在于当前目录的一个文件 输入代码: import ospath = os.path.exists('user.py')print(path)输出结果: T

php生成zip压缩文件的方法,支持文件和压缩包路径查找

/* * new creatZip($_dir,$_zipName); *@ _dir是被压缩的文件夹名称,可使用路径,例 'a'或者'a/test.txt'或者'test.txt' *@ _zipName是压缩后的压缩包名称,可使用路径,例 'a/test.zip'或者'test.zip' **/ class creatZip { private $_dir; private $_zipDir; private $_zipName; public function __construct($d