请求访问相机胶卷的权限
我有一个设置视图,用户可以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,因为这个事实,你将需要处理
ALAuthorizationStatus
和PHAuthorizationStatus
。
最简单的是做…
if ([PHPhotoLibrary class]) { //Use the Photos framework } else { //Use the Asset Library framework }
-
您需要决定将哪个媒体collections集用作源代码,这取决于您的应用所使用的设备。 将运行在哪个版本的操作系统上。
-
如果授权被用户拒绝,您可能需要将用户指向设置。
- Entity Framework 6 GUID作为主键:不能将NULL值插入到列'Id',表'FileStore'; 列不允许空值
- 方法调用release()exception后无法使用android相机继续
- FMDBBlockSQLiteCallBackFunction在不使用makeFunctionNamed的应用程序中崩溃
- NSURLConnection sendAsynchronousRequest:queue:completionHandler:在一行中发出多个请求?
- 在IB之下IBOutlets应该强大还是弱?
- iOS UICollectionView原型单元格大小属性被忽略
- Xcode 4.4错误 – 超时等待应用程序启动
- 如何调整UIImage的大小以减less上传图片的大小
- iPhone核心数据保存时未解决的错误
- xcode 5.1:libCordova.a架构问题
- 在iOS UILabel上设置BOLD字体