请求访问相机胶卷的权限

我有一个设置视图,用户可以select打开或closures“ 导出到相机胶卷 ”function

当用户第一次打开它(而不是当他拍摄第一张照片时),我希望应用程序向他请求访问相机胶卷的权限。

我已经看到许多应用程序的行为,但无法find办法。

我不确定是否有一些内置的方法,但是一个简单的方法是使用ALAssetsLibrary在打开function时从照片库中取出一些没有意义的信息。 然后,您可以简单地取消您拉取的任何信息,并且您将提示用户访问他们的照片。

例如下面的代码只不过是获取相机胶卷中的照片数量,但足以触发许可提示。

#import <AssetsLibrary/AssetsLibrary.h> ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init]; [lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { NSLog(@"%zd", [group numberOfAssets]); } failureBlock:^(NSError *error) { if (error.code == ALAssetsLibraryAccessUserDeniedError) { NSLog(@"user denied access, code: %zd", error.code); } else { NSLog(@"Other error code: %zd", error.code); } }]; 

编辑:刚才偶然发现这一点,下面是如何检查您的应用程序访问相册的授权状态。

 ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; if (status != ALAuthorizationStatusAuthorized) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Attention" message:@"Please give this app permission to access your photo library in your settings app!" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil, nil]; [alert show]; } 

由于带有Photos框架的 iOS 8使用:

Swift 3.0

 PHPhotoLibrary.requestAuthorization { status in switch status { case .authorized: <#your code#> case .restricted: <#your code#> case .denied: <#your code#> default: // place for .notDetermined - in this callback status is already determined so should never get here break } } 

Objective-C

 [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { switch (status) { case PHAuthorizationStatusAuthorized: <#your code#> break; case PHAuthorizationStatusRestricted: <#your code#> break; case PHAuthorizationStatusDenied: <#your code#> break; default: break; } }]; 

来自文档的重要说明:

这个方法总是立即返回。 如果用户之前已经授予或拒绝了照片库访问权限,则在调用时执行处理程序块; 否则,只有在用户响应警报后才会显示警报并执行该块。

从iOS 10开始,我们还需要在我介绍的info.plist文件中提供照片库使用说明。 然后,只需使用此代码即可在每次需要时显示警报:

 - (void)requestAuthorizationWithRedirectionToSettings { dispatch_async(dispatch_get_main_queue(), ^{ PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus]; if (status == PHAuthorizationStatusAuthorized) { //We have permission. Do whatever is needed } else { //No permission. Trying to normally request it [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { if (status != PHAuthorizationStatusAuthorized) { //User don't give us permission. Showing alert with redirection to settings //Getting description string from info.plist file NSString *accessDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSPhotoLibraryUsageDescription"]; UIAlertController * alertController = [UIAlertController alertControllerWithTitle:accessDescription message:@"To give permissions tap on 'Change Settings' button" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]; [alertController addAction:cancelAction]; UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Change Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; }]; [alertController addAction:settingsAction]; [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil]; } }]; } }); } 

当警报没有出现时,也有一些常见的情况。 为了避免复制,我希望你看看这个答案 。

用户第一次尝试写入iOS 6相机胶卷时,他/她自动被要求获得许可。 您不必添加额外的代码(在authorisationstatus是ALAuthorizationStatusNotDetermined之前)。

如果用户第一次否认你不能再问(据我所知)。 用户必须在设置 – >隐私 – >照片部分中手动更改该应用的特定设置。

还有一个选项,那就是用户由于父母控制等其他限制而不能授予权限,在这种情况下,状态是ALAuthorizationStatusRestricted

迅速:

 import AssetsLibrary var status:ALAuthorizationStatus = ALAssetsLibrary.authorizationStatus() if status != ALAuthorizationStatus.Authorized{ println("User has not given authorization for the camera roll") } 
 #import <AssetsLibrary/AssetsLibrary.h> 

//////

 ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; switch (status) { case ALAuthorizationStatusRestricted: { //Tell user access to the photos are restricted } break; case ALAuthorizationStatusDenied: { // Tell user access has previously been denied } break; case ALAuthorizationStatusNotDetermined: case ALAuthorizationStatusAuthorized: // Try to show image picker myPicker = [[UIImagePickerController alloc] init]; myPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; myPicker.delegate = self; [self presentViewController: myPicker animated:YES completion:NULL]; break; default: break; } 

iOS 9.2.1,Xcode 7.2.1,ARC启用

不推荐使用“ALAuthorizationStatus”:在iOS 9.0中不推荐使用 – 改为在Photos框架中使用PHAuthorizationStatus

请看这个post以获得更新的解决scheme:

确定是否设置了对图片库的访问 – PHPhotoLibrary(iOS 8)

重要提示:

  • 从今天的date来看,你最有可能正在为iOS7.0 +devise,因为这个事实,你将需要处理ALAuthorizationStatusPHAuthorizationStatus

最简单的是做…

 if ([PHPhotoLibrary class]) { //Use the Photos framework } else { //Use the Asset Library framework } 
  • 您需要决定将哪个媒体collections集用作源代码,这取决于您的应用所使用的设备。 将运行在哪个版本的操作系统上。

  • 如果授权被用户拒绝,您可能需要将用户指向设置。