iOS请求相机权限

请求相机权限,未授权过的话弹出系统弹框,不是第一次授权直接返回结果,如果被禁止了提示用户去开启,支持8.0以上系统直接跳转到设置

+ (void)requestUseVideoCamera:(void(^)(BOOL isCanUse))CompletionHandler
{
        NSString *tipTextWhenNoPhotosAuthorization; // 提示语
        NSString *mediaType = AVMediaTypeVideo;     //读取媒体类型
        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];          //读取设备授权状态
        if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied) {
            NSDictionary *mainInfoDictionary = [[NSBundle mainBundle] infoDictionary];
            NSString *appName = [mainInfoDictionary objectForKey:@"CFBundleDisplayName"];
            tipTextWhenNoPhotosAuthorization = [NSString stringWithFormat:@"请在\"设置-隐私-相机\"选项中,允许%@访问你的手机相机", appName];
            UIViewController *currentController = [[AppDelegate appDelegate] getNewCurrentViewController];

            [self showAlertViewFromController:currentController
                                        title:@"温馨提示"
                                      message:tipTextWhenNoPhotosAuthorization
                            CancleButtonTitle:@"取消"
                             otherButtonTitle:@"去设置"
                            cancleButtonClick:^{

                            } otherButtonClick:^{
                                [self openSystemSetting];
                            }];
            // 展示提示语
            NSLog(@" -- %@ ",tipTextWhenNoPhotosAuthorization);
            if (CompletionHandler) {
                CompletionHandler(NO);
            }
        }
        else if(authStatus == AVAuthorizationStatusNotDetermined) { //第一次请求。
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        if (CompletionHandler) {
                             CompletionHandler(granted);
                        }
                      }];
             });
        }
        else {
            if (CompletionHandler) {
                CompletionHandler(YES);
            }
        }
}

+ (void)openSystemSetting
{
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    }
}
+ (void)showAlertViewFromController:(UIViewController *)controller
                              title:(NSString *)title
                            message:(NSString *)message
                  CancleButtonTitle:(NSString *)cancleTitle
                   otherButtonTitle:(NSString *)otherTitle
                  cancleButtonClick:(void(^)(void))cancleClick
                   otherButtonClick:(void(^)(void))otherButtonClick
{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:cancleTitle
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction * _Nonnull action) {
                                                          cancleClick ();
                                               }]];          
    
    [alertController addAction:[UIAlertAction actionWithTitle:otherTitle
                                                        style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction * _Nonnull action) {
                                                          otherButtonClick ();
                                                      }]];
    
    [controller presentViewController:alertController
                             animated:YES
                           completion:nil];
}

需要导入

#import <AVFoundation/AVCaptureDevice.h>

其中遇到的比较坑的点是

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { 
//分线程
});

回调的block是分线程。不小心在block里操作UI就会有诡异的现象发生,比如push会大约8秒才跳转。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,437评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,283评论 4 61
  • 大胆的设想 其实他的冷漠 并不如是 大概他不过是很真实的在表达自己
    邋遢裤子阅读 82评论 0 0
  • 今天放学从从河边走 ,以前也没注意什么。 今天先是往对面望了一下 。看哪块有灯亮着。在仔细一看。风雨廊桥。我欣喜...
    老领导阅读 326评论 0 1
  • 昨晚河边散步,看到一位年轻却胖到有200多斤的女子在艰难的减肥,我一直在想为什么会如此放纵自己,就在我准备叹息...
    琳琳琳琳才阅读 555评论 0 1