iOS請求相機權(quán)限

請求相機權(quán)限,未授權(quán)過的話彈出系統(tǒng)彈框,不是第一次授權(quán)直接返回結(jié)果,如果被禁止了提示用戶去開啟,支持8.0以上系統(tǒng)直接跳轉(zhuǎn)到設(shè)置

+ (void)requestUseVideoCamera:(void(^)(BOOL isCanUse))CompletionHandler
{
        NSString *tipTextWhenNoPhotosAuthorization; // 提示語
        NSString *mediaType = AVMediaTypeVideo;     //讀取媒體類型
        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];          //讀取設(shè)備授權(quán)狀態(tài)
        if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied) {
            NSDictionary *mainInfoDictionary = [[NSBundle mainBundle] infoDictionary];
            NSString *appName = [mainInfoDictionary objectForKey:@"CFBundleDisplayName"];
            tipTextWhenNoPhotosAuthorization = [NSString stringWithFormat:@"請在\"設(shè)置-隱私-相機\"選項中,允許%@訪問你的手機相機", appName];
            UIViewController *currentController = [[AppDelegate appDelegate] getNewCurrentViewController];

            [self showAlertViewFromController:currentController
                                        title:@"溫馨提示"
                                      message:tipTextWhenNoPhotosAuthorization
                            CancleButtonTitle:@"取消"
                             otherButtonTitle:@"去設(shè)置"
                            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];
}

需要導(dǎo)入

#import <AVFoundation/AVCaptureDevice.h>

其中遇到的比較坑的點是

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

回調(diào)的block是分線程。不小心在block里操作UI就會有詭異的現(xiàn)象發(fā)生,比如push會大約8秒才跳轉(zhuǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,937評論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,185評論 4 61
  • 大膽的設(shè)想 其實他的冷漠 并不如是 大概他不過是很真實的在表達自己
    邋遢褲子閱讀 91評論 0 0
  • 今天放學(xué)從從河邊走 ,以前也沒注意什么。 今天先是往對面望了一下 ??茨膲K有燈亮著。在仔細一看。風(fēng)雨廊橋。我欣喜...
    老領(lǐng)導(dǎo)閱讀 345評論 0 1
  • 昨晚河邊散步,看到一位年輕卻胖到有200多斤的女子在艱難的減肥,我一直在想為什么會如此放縱自己,就在我準備嘆息...
    琳琳琳琳才閱讀 608評論 0 1

友情鏈接更多精彩內(nèi)容