iOS开发——系统相册操作

来源:互联网 发布:淘宝客服在线回复话术 编辑:程序博客网 时间:2024/06/01 09:27
在我们的应用中使用图片、视频,尤其是大量的图片、视频的时候。如果存储在沙盒中,会使得该应用的沙盒文件越来越大。所以,一些图片、视频资源可以放到系统相册中保存。这样也有利于用户查看该类资源。
但是,资源存储在了系统相册,我们对其的访问就受到了一定的限制。具体解决办法如下:
1.把视频、图片存储在系统相册:
ALAssetsLibrary *library = [[ALAssetsLibraryalloc]init];
视频存储:- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock;
图片存储:- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock 
2.把图片、视频文件从相册中读取出来:
- (void)getThumImageAndURLForPhotoAndVideo
{
   
__weakXYLocalAlbumViewcontroller *weakSelf =self;
   
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
       
ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {
           
if (group !=nil) {
                [weakSelf.
groupArraysaddObject:group];
               
NSLog(@"[group valueForProperty:ALAssetsGroupPropertyName]: %@",[group valueForProperty:ALAssetsGroupPropertyName]);
               
if ([[groupvalueForProperty:ALAssetsGroupPropertyName]isEqualToString:XIAOYIALBUM]) {
                   
self.collectionViewCellCount = group.numberOfAssets;
                   
NSLog(@"self.collectionViewCellCount: %ld",self.collectionViewCellCount);
                   
                    // UI的更新记得放在主线程
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [
selfcreateCollectionViewForAlbum];
                    });
                }
            }
else {
                [weakSelf.
groupArraysenumerateObjectsUsingBlock:^(id obj, NSUInteger idx,BOOL *stop) {
                   
NSLog(@"obj----idx: %@---------%lu",obj, (unsignedlong)idx);
                   
if ([[(ALAssetsGroup *)obj valueForProperty:ALAssetsGroupPropertyName]isEqualToString:XIAOYIALBUM]) {
                        [obj
enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index,BOOL *stop) {
                           
if ([resultthumbnail] !=nil) {
                               
//照片
                               
if ([[resultvalueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto]){
                                   
                                   
NSDate *date= [resultvalueForProperty:ALAssetPropertyDate];
                                   
//                                UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];
                                   
NSString *fileName = [[resultdefaultRepresentation]filename];
                                   
NSURL *url = [[resultdefaultRepresentation]url];
                                   
int64_t fileSize = [[resultdefaultRepresentation]size];
                                   
                                   
NSLog(@"date = %@",date);
                                   
NSLog(@"fileName = %@",fileName);
                                   
NSLog(@"url = %@",url);
                                   
NSLog(@"fileSize = %lld",fileSize);
                                   
                                   
// UI的更新记得放在主线程,要不然等子线程排队过来都不知道什么年代了,会很慢的
                                   
dispatch_async(dispatch_get_main_queue(), ^{
                                       
                                    });
                                }
                               
//视频
                               
elseif ([[resultvalueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypeVideo] ){
                                   
                                   
//和图片方法类似
                                   
NSDate *date= [resultvalueForProperty:ALAssetPropertyDate];
                                   
//                                UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];
                                   
NSString *fileName = [[resultdefaultRepresentation]filename];
                                   
NSURL *url = [[resultdefaultRepresentation]url];
                                   
int64_t fileSize = [[resultdefaultRepresentation]size];
                                   
                                   
NSLog(@"date = %@",date);
                                   
NSLog(@"fileName = %@",fileName);
                                   
NSLog(@"url = %@",url);
                                   
NSLog(@"fileSize = %lld",fileSize);
                                }
                            }
                        }];
                    }
                  
                }];
               
            }
        };
       
       
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error)
        {
           
           
NSString *errorMessage =nil;
           
           
switch ([errorcode]) {
               
caseALAssetsLibraryAccessUserDeniedError:
               
caseALAssetsLibraryAccessGloballyDeniedError:
                    errorMessage =
@"用户拒绝访问相册,请在<隐私>中开启";
                   
break;
                   
               
default:
                    errorMessage =
@"Reason unknown.";
                   
break;
            }
           
           
dispatch_async(dispatch_get_main_queue(), ^{
               
UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:@"错误,无法访问!"
                                                                  
message:errorMessage
                                                                 
delegate:self
                                                        
cancelButtonTitle:@"确定"
                                                        
otherButtonTitles:nil,nil];
                [alertView
show];
            });
        };
       
       
       
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibraryallocinit];
        [assetsLibrary
enumerateGroupsWithTypes:ALAssetsGroupAll
                                    
usingBlock:listGroupBlockfailureBlock:failureBlock];
    });
}

//获取图片、视频的缩略图
- (void)getThumbnail
{
    ALAssetsLibrary *assetLibrary = [[ALAssetsLibraryalloc]init];
    for (int i = 0 ; i <self.dataArray.count; i++) {
       
//获取路径
       
NSString *string =self.dataArray[i];
       
NSURL *url = [NSURLURLWithString:string];
       
//根据图片url获取图片
        [assetLibrary
assetForURL:urlresultBlock:^(ALAsset *asset) {
            if (asset != nil) {
                //缩略图img
                UIImage *image = [UIImageimageWithCGImage:asset.thumbnail];
               
//
               
if (image !=nil) {
                    [
self.imagesArrayaddObject:image];
                   
                   
//大图不需要
                   
                   
//判断文件后缀,是图片还是视频,放到数组中,只有mp4格式被认为是视频
                   
NSRange range = [stringrangeOfString:@"&ext="];
                   
NSInteger loc = range.location + range.length;
                   
NSString *subString = [stringsubstringFromIndex:loc];
                   
NSString *suffix =nil;
                   
if ([subStringisEqualToString:@"mp4"]) {
                        suffix =
@"mp4";
                    }
else {
                        suffix =
@"notMp4";
                    }
                    [
self.photoOrVideoArrayaddObject:suffix];
                   
                    [
self.imageDictsetObject:imageforKey:string];
                    [self.typeDictsetObject:suffixforKey:string];
                }
            }


        }
failureBlock:^(NSError *error) {
            
        }];
       
    }
}

除了删除操作,其他的操作基本都有了。
0 0