码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-09-01 18:37:38      阅读:429      评论:0      收藏:0      [点我收藏+]

标签:

在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();
            }
        }
    }];
}


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

标签:

原文地址:http://my.oschina.net/linxiaoxi1993/blog/500268

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!