有关相册访问

转载自:http://blog.csdn.net/lusonglin121/article/details/9194399

http://code4app.com/ios/Photo-Gallery/4f7047976803fad737000000
http://www.cocoachina.com/bbs/simple/?t64426.html

在iOS6.0以上系统增加了隐私的选项,例如你的相册,通讯录,地理位置等,都会被保护,任意一个第三方的app 访问都要经过用户自己的同意,

例如:


这样我们自己的app 有时候也会需要知道用户是同意了还是不同意,好做一些处理。

这个也是有办法解决的,具体方法是:

1. 导入库“AssetsLibrary.framework”

2.在要用的类中引入头文件:#import<AssetsLibrary/ALAssetsLibrary.h>

3.在要调用系统相册的方法中加入一下代码:

[html]  view plain copy
  1. if ([ALAssetsLibrary authorizationStatus] == ALAuthorizationStatusNotDetermined) {  
  2.          
  3.        ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];  
  4.          
  5.        [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {  
  6.              
  7.            if (*stop) {  
  8.                //点击“好”回调方法:这里是重点  
  9.                NSLog(@"好");  
  10.                return;  
  11.                  
  12.            }  
  13.            *stop = TRUE;  
  14.              
  15.        } failureBlock:^(NSError *error) {  
  16.              
  17.            //点击“不允许”回调方法:这里是重点  
  18.            NSLog(@"不允许");  
  19.           [self dismissViewControllerAnimated:YES completion:nil];  
  20.              
  21.        }];  
  22.    }  


这里我是在一个button里面做了处理,如下:

[html]  view plain copy
  1. -(IBAction)LoadPhotoAlbum:(id)sender  
  2. {  
  3.     if ([ALAssetsLibrary authorizationStatus] == ALAuthorizationStatusNotDetermined) {  
  4.           
  5.         ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];  
  6.           
  7.         [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {  
  8.               
  9.             if (*stop) {  
  10.                 //点击“好”回调方法:  
  11.                 NSLog(@"好");  
  12.                 return;  
  13.                   
  14.             }  
  15.             *stop = TRUE;  
  16.               
  17.         } failureBlock:^(NSError *error) {  
  18.               
  19.             //点击“不允许”回调方法:  
  20.             NSLog(@"不允许");  
  21.            [self dismissViewControllerAnimated:YES completion:nil];  
  22.               
  23.         }];  
  24.     }  
  25.       
  26.     UIImagePickerController *PickerC = [[UIImagePickerController alloc] init];  
  27.     PickerC.delegate = self;  
  28.     PickerC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  29.     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {  
  30.         popOver = [[UIPopoverController alloc] initWithContentViewController:PickerC];  
  31.         [popOver presentPopoverFromRect:CGRectMake(0, 800, 500, 500) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];  
  32.           
  33.         popOver.delegate = self;  
  34.     } else {  
  35.         [self presentViewController:PickerC animated:YES completion:nil];  
  36.     }  
  37.       
  38. }  

然后就完全ok了。

如果我选择了“不允许”我会自己让我的imagePickerView dismiss。



如果点击了“好”。那就可以正常访问了:


下一步就是人脸识别了:


ok了。


源代码下载



转载自:http://94it.net/a/jingxuanboke/2013/1113/181306.html


项目要用到图片上传功能,要求读取相册中的全部图片加以展示,由用户选择进行上传。从网上找了大家比较通用的方法,稍加修改,实现了需求。

参考代码:ELCImagePickerDemo


一、读取相册

// Load Albums into assetGroups dispatch_async(dispatch_get_main_queue(), ^ { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Group enumerator Block void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) { if (group == nil) { return; } [self.assetGroups addObject:group]; // Reload albums [self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:YES]; }; // Group Enumerator Failure Block void (^assetGroupEnumberatorFailure)(NSError *) = ^(NSError *error) { UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Album Error: %@ - %@", [error localizedDescription], [error localizedRecoverySuggestion]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; [alert release]; NSLog(@"A problem occured %@", [error description]); }; // Enumerate Albums [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:assetGroupEnumberatorFailure]; [pool release]; });

上面的代码就是用于读取相册内容的。几点说明:

1. 因为图片中包含位置信息,因此访问图片资源时,系统会弹出询问框“是否允许访问位置信息”?如果选择否,就会进入这一块assetGroupEnumberatorFailure,提示读取图片失败。据说ios5.0以后系统才增加了这个提示,之前是没有这种情况的。

2. ios5.0以后用户可以自己新建相簿,因此这个ALAssetsGroupAll这个值是表示读出所有相簿,你可以把每个相簿列出来,再进一步选择展示哪个相簿中的图片。开源例子中就是这个效果。不过因为我的需求是只展示系统默认的“相机胶卷”这个相簿中的图片,因此,把这里改为ALAssetsGroupSavedPhotos这个值,就可以直接读取相机胶卷中的照片,不需要进一步选择了。


二、读取相册中的图片

ELCAssetTablePicker.m中的preparePhotos函数

-(void)preparePhotos { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"enumerating photos"); [self.assetGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { if(result == nil) { return; } ELCAsset *elcAsset = [[[ELCAsset alloc] initWithAsset:result] autorelease]; [elcAsset setParent:self]; [self.elcAssets addObject:elcAsset]; }]; NSLog(@"done enumerating photos"); [self.tableView reloadData]; [self.navigationItem setTitle:@"Pick Photos"]; [pool release]; }

在次之前,可以对assetGroup设置过滤,如下设置为只读取图片。因为其实用手机拍摄的视频也会存入“相机胶卷”中,所以可以根据自己的需要进行过滤。

[picker.assetGroupsetAssetsFilter:[ALAssetsFilter allPhotos]];

每张图片对应的就是一个ALAsset对象。


三、读取出的图片信息

[self.asset thumbnail]
ALAsset的thumbnail是图片的缩略图,如果你需要以九宫格的形式把图片都展示出来,肯定要展示的是缩略图,而不能是巨大的原图。

-(void)selectedAssets:(NSArray*)_assets { NSMutableArray *returnArray = [[[NSMutableArray alloc] init] autorelease]; for(ALAsset *asset in _assets) { NSMutableDictionary *workingDictionary = [[NSMutableDictionary alloc] init]; [workingDictionary setObject:[asset valueForProperty:ALAssetPropertyType] forKey:@"UIImagePickerControllerMediaType"]; [workingDictionary setObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]] forKey:@"UIImagePickerControllerOriginalImage"]; [workingDictionary setObject:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]] forKey:@"UIImagePickerControllerReferenceURL"]; [returnArray addObject:workingDictionary]; [workingDictionary release]; } [self popToRootViewControllerAnimated:NO]; [[self parentViewController] dismissModalViewControllerAnimated:YES]; if([delegate respondsToSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:)]) { [delegate performSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:) withObject:self withObject:[NSArray arrayWithArray:returnArray]]; } }这个函数,将用户选择的图片的信息记录下来,在主界面上弄个scrollView来一一展示,这里就要用到原图了,开源的例子有问题,居然把图片都加载进去了,选多了必然崩溃呀,反正就是示例吧,没考虑那么细。

(责任编辑:赵红霞)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值