美文网首页
iOS请求相机权限

iOS请求相机权限

作者: 瞬csr | 来源:发表于2017-07-19 15:54 被阅读640次

请求相机权限,未授权过的话弹出系统弹框,不是第一次授权直接返回结果,如果被禁止了提示用户去开启,支持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秒才跳转。

相关文章

  • iOS请求相机权限

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

  • iOS各种访问权限总结

    麦克风访问(AVAudioSession) 权限查看 权限请求 相机访问(AVCaptureDevice) 权限查...

  • 相册相机访问

    判断相册访问权限 iOS 8 之前 iOS 8之后 两者结合即是 判断相机访问权限 iOS7之前都可以访问相机,i...

  • 相机、相册权限请求问题

    问题: 在调用相机时,进行了权限请求,发生了Crash。 原因: 在相机权限请求回调中,不在主线程,故唤起UIIm...

  • 20170313 iOS 权限相关 : 判断与 跳转 设置

    iOS 常见错误(持续更新) iOS权限获取 摄像头与麦克风 iOS各种权限判断(相机,相册,定位,录音) ios...

  • iOS相关权限检测和申请

    iOS权限相关的检测和申请 在iOS开发过程中常用到的权限整理如下: 相册权限检测 相册权限申请 相机权限检测 相...

  • 请求相册|相机权限

    下面是自己项目中写的请求相机跟相册权限,有需要则直接copy过来用 需要#import

  • iOS系统权限获取

    iOS系统权限: 相册、相机、麦克风、推送通知、AppleMusic 相册权限状态:ALAuthorization...

  • 【iOS】自定义相机(二)权限获取

    在自定义相机的时候,肯定是需要获取相机权限、麦克风权限和相册写入权限。权限获取这个在iOS开发中十分常见了,具体操...

  • react-native 使用PermissionsAndroi

    在扫码功能中使用PermissionsAndroid请求相机权限没有弹出权限弹窗并且报警告:"Tried to u...

网友评论

      本文标题:iOS请求相机权限

      本文链接:https://www.haomeiwen.com/subject/kavlkxtx.html