अगर उपयोगकर्ता ने कैमरे का उपयोग करने की अनुमति दी है तो कैसे जांचें?


81

यह लिखने की कोशिश कर रहा है:

if usergavepermissiontousercamera  
  opencamera
else 
  showmycustompermissionview

इस सरल कार्य को करने का वर्तमान तरीका नहीं मिल सका।
नोट: iOS7 को काम करना चाहिए भले ही इसके लिए अलग तरीके की आवश्यकता हो


आपको इस लिंक की जांच करनी चाहिए। stackoverflow.com/questions/25803217/… स्विफ्ट में अनुवाद करने के लिए कठिन नहीं होना चाहिए।
मेहदी.सकली

AVCaptureDevice और AVAuthorizationStatus दोनों एक बग या कुछ और xcode द्वारा मान्यता प्राप्त नहीं हैं, लेकिन हाँ यह बहुत कठिन बना देता है।
एसकरौर्थ

उस जवाब की जाँच की। कैमरा रोल के लिए इसकी, कैमरा नहीं यह स्वयं
Esqarrouth

जवाबों:


176

आप ऐसा करने के लिए निम्न कोड का उपयोग कर सकते हैं:

if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) ==  AVAuthorizationStatus.Authorized {
    // Already Authorized
} else {
    AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in
       if granted == true {
           // User granted
       } else {
           // User rejected
       }
   })
}

ध्यान दें:

  1. सुनिश्चित करें कि आप AVFoundationबिल्ड चरणों के लिंक बाइनरी अनुभाग में फ्रेमवर्क जोड़ते हैं
  2. आपको import AVFoundationआयात करने के लिए अपनी कक्षा पर लिखना चाहिएAVFoundation

स्विफ्ट 3

if AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) ==  AVAuthorizationStatus.authorized {
   // Already Authorized
} else {
   AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in
      if granted == true {
         // User granted
      } else {
         // User Rejected
      }
   })
}

स्विफ्ट 4

if AVCaptureDevice.authorizationStatus(for: .video) ==  .authorized {
    //already authorized
} else {
    AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
        if granted {
            //access allowed
        } else {
            //access denied
        }
    })
}

धन्यवाद। बाइनरी को जोड़ने के बिना आयात किए गए काम। लेकिन मैं चौखटे में फाउंडेशन है। क्या यह संबंधित है?
एस्कार्रॉउथ

1
@Esq: आपको द्विआधारी लिंक करने की आवश्यकता नहीं है, क्योंकि स्विफ्ट आयात के अनुसार किसी भी ऑब्जेक्ट-सी फ्रेमवर्क (या सी लाइब्रेरी) जो कि एक मॉड्यूल के रूप में सुलभ है, स्विफ्ट में सीधे आयात किया जा सकता है। इसमें सभी ऑब्जेक्टिव-सी सिस्टम फ्रेमवर्क शामिल हैं - जैसे कि फाउंडेशन, यूआईकिट, और स्प्राइटकिट-साथ ही सिस्टम के साथ आपूर्ति की जाने वाली सामान्य सी लाइब्रेरी। मीरा X'mas ...
Midhun सांसद

धन्यवाद, मीरा xmas आप भी :) ios7 में btw इस विधि में पहले से ही अधिकृत प्रवेश करती है, हालांकि इसे कभी भी अनुरोध नहीं मिला। ऐसा क्यों है और मैं इसे कैसे ठीक कर सकता हूं?
एसकर्रौथ

@Esq: यदि आपके ऐप में पहले से ही अनुमति है और सेटिंग ऐप में सेट है, तो यह फिर से नहीं पूछेगा। अपनी सेटिंग ऐप जांचें कि आपके पास अनुमति है या नहीं।
मिधुन एमपी

मैं इस कोशिश से पहले सिम्युलेटर सेटिंग्स को रीसेट करें। जाकर ऐप के बारे में कुछ नहीं होने पर सेटिंग्स को चेक किया। ios7.1 सिम्युलेटर पर इसकी कोशिश कर रहा है
एस्कार्रॉउथ

18

स्विफ्ट 3.0 अद्यतन समाधान

func callCamera(){
    let myPickerController = UIImagePickerController()
    myPickerController.delegate = self;
    myPickerController.sourceType = UIImagePickerControllerSourceType.camera

    self.present(myPickerController, animated: true, completion: nil)
    NSLog("Camera");
}
func checkCamera() {
    let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
    switch authStatus {
    case .authorized: callCamera() // Do your stuff here i.e. callCameraMethod()
    case .denied: alertPromptToAllowCameraAccessViaSetting()
    case .notDetermined: alertToEncourageCameraAccessInitially()
    default: alertToEncourageCameraAccessInitially()
    }
}

func alertToEncourageCameraAccessInitially() {
    let alert = UIAlertController(
        title: "IMPORTANT",
        message: "Camera access required for capturing photos!",
        preferredStyle: UIAlertControllerStyle.alert
    )
    alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
    alert.addAction(UIAlertAction(title: "Allow Camera", style: .cancel, handler: { (alert) -> Void in
        UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
    }))
    present(alert, animated: true, completion: nil)
}

func alertPromptToAllowCameraAccessViaSetting() {

    let alert = UIAlertController(
        title: "IMPORTANT",
        message: "Camera access required for capturing photos!",
        preferredStyle: UIAlertControllerStyle.alert
    )
    alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel) { alert in
        if AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo).count > 0 {
            AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in
                DispatchQueue.main.async() {
                    self.checkCamera() } }
        }
        }
    )
    present(alert, animated: true, completion: nil)
}

), मैं आपको लगता है तरीकों alertToEncourageCameraAccessInitially और alertPromptToAllowCameraAccessViaSetting की मिश्रित नाम
jonaszmclaren

आप उत्तर को बेहतर बना सकते हैं। यह बेहतर होगा। अन्यथा जब मैं मुक्त हो जाऊंगा तब मैं इसकी जांच करूंगा। धन्यवाद :) @jonaszmclaren
सौरभ शर्मा

14

निम्नलिखित स्विफ्ट 4.x के लिए अद्यतन किया गया एक साफ किया गया उत्तर है:

IOS 10 से शुरू होकर, क्रैश से बचने के लिए आपको info.plist फ़ाइल में अनुमति का अनुरोध करना होगा:

यहाँ छवि विवरण दर्ज करें

गोपनीयता - कैमरा उपयोग विवरण

आपको एक स्ट्रिंग प्रदान करनी होगी जो इस कुंजी के साथ उपयोगकर्ता को प्रस्तुत की जाती है। ऐसा करने में विफलता कैमरा का उपयोग करने का प्रयास करते समय एक दुर्घटना में परिणाम देगा।

import AVFoundation

func checkCameraAccess() {
    switch AVCaptureDevice.authorizationStatus(for: .video) {
    case .denied:
        print("Denied, request permission from settings")
        presentCameraSettings()
    case .restricted:
        print("Restricted, device owner must approve")
    case .authorized:
        print("Authorized, proceed")
    case .notDetermined:
        AVCaptureDevice.requestAccess(for: .video) { success in
            if success {
                print("Permission granted, proceed")
            } else {
                print("Permission denied")
            }
        }
    }
}

func presentCameraSettings() {
    let alertController = UIAlertController(title: "Error",
                                  message: "Camera access is denied",
                                  preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "Cancel", style: .default))
    alertController.addAction(UIAlertAction(title: "Settings", style: .cancel) { _ in
        if let url = URL(string: UIApplicationOpenSettingsURLString) {
            UIApplication.shared.open(url, options: [:], completionHandler: { _ in
                // Handle
            })
        }
    })

    present(alertController, animated: true)
}

यह चार संभावित जवाबों के लिए परीक्षण करेगा, और फिर या तो अनुमति का अनुरोध करता है notDetermined, या यदि यह है तो इसे सक्षम करने के लिए उपयोगकर्ता को सेटिंग्स को निर्देशित करता है denied। यदि यह है restricted, तो वर्तमान उपयोगकर्ता इसे सक्षम करने में सक्षम नहीं हो सकता है, लेकिन आपको उन्हें कुछ मार्गदर्शन प्रदान करना चाहिए।


9

यह कैमरा तब खुलेगा जब उपयोगकर्ता द्वारा अनुमति दी जाएगी। अन्यथा अनुमति मांगने के लिए सतर्क रहें।

func openCamera(){
        
        let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
        
        switch (authStatus){
            
        case .notDetermined, .restricted, .denied:
            showAlert(title: "Unable to access the Camera", message: "To enable access, go to Settings > Privacy > Camera and turn on Camera access for this app.")
        case .authorized:
            alert.dismiss(animated: true, completion: nil)
            if(UIImagePickerController .isSourceTypeAvailable(.camera)){
                picker.sourceType = .camera
                picker.showsCameraControls=true
                picker.allowsEditing=true
                self.viewController!.present(picker, animated: true, completion: nil)
            }
        }
}

इसके बाद अलर्ट दिखाने के लिए इस फ़ंक्शन को कॉल करें

func showAlert(title:String, message:String) {
        let alert = UIAlertController(title: title,
                                      message: message,
                                      preferredStyle: UIAlertController.Style.alert)
        
        let okAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
        alert.addAction(okAction)
        
        let settingsAction = UIAlertAction(title: "Settings", style: .default, handler: { _ in
            // Take the user to Settings app to possibly change permission.
            guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return }
            if UIApplication.shared.canOpenURL(settingsUrl) {
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                        // Finished opening URL
                    })
                } else {
                    // Fallback on earlier versions
                    UIApplication.shared.openURL(settingsUrl)
                }
            }
        })
        alert.addAction(settingsAction)
        
        self.viewController!.present(alert, animated: true, completion: nil)
    }

+1, जैसा कि एक छोटे से बदलाव के बाद इसने मेरे लिए काम किया। पहली बार के मामले को छोड़कर सभी अच्छे। सही हो जाएगा, इसलिए हम या तो वह सब करने के लिए आगे बढ़ सकते हैं, जो हमने अनधिकृत मामले में किया था, क्योंकि इसकी अनुमति के लिए पूछना / इनकार करना या हम उपयोगकर्ता को "AVCapturevevice.requestAccess" के साथ प्रस्तुत कर सकते हैं। : ।वीडियो)"। अगले प्रयास से स्विच केस पहली बार प्रतिक्रिया के आधार पर अनुसरण करेगा। पहली बार जब तक हम इनकार / अनुमति नहीं देते हैं, तब तक हम इसे गोपनीयता सेटिंग्स में नहीं देखेंगे।
लोकेश पुरोहित

2

मैंने उपरोक्त उत्तर को संशोधित किया है और प्रारंभिक प्रॉम्प्ट को हटा दिया है, क्योंकि जब हम डिवाइस के कैमरे का उपयोग करना चाहते हैं, तो सिस्टम अनुमतियों के लिए संकेत दे रहा है:

func checkPermissions() {
    let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)

    switch authStatus {
    case .authorized:
        setupCamera()
    case .denied:
        alertPromptToAllowCameraAccessViaSetting()
    default:
        // Not determined fill fall here - after first use, when is't neither authorized, nor denied
        // we try to use camera, because system will ask itself for camera permissions
        setupCamera()
    }
}

func alertPromptToAllowCameraAccessViaSetting() {
    let alert = UIAlertController(title: "Error", message: "Camera access required to...", preferredStyle: UIAlertControllerStyle.alert)

    alert.addAction(UIAlertAction(title: "Cancel", style: .default))
    alert.addAction(UIAlertAction(title: "Settings", style: .cancel) { (alert) -> Void in
        UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
    })

    present(alert, animated: true)
}

2

आप AVFoundation फ्रेमवर्क को आयात कर सकते हैं और नीचे दिखाए गए प्राधिकरण विधि का उपयोग कर सकते हैं (:) के लिए और संबंधित मामलों को संभाल सकते हैं।

switch AVCaptureDevice.authorizationStatus(for: .video) {
    case .authorized: // The user has previously granted access to the camera.
        self.setupCaptureSession()

    case .notDetermined: // The user has not yet been asked for camera access.
        AVCaptureDevice.requestAccess(for: .video) { granted in
            if granted {
                self.setupCaptureSession()
            }
        }

    case .denied: // The user has previously denied access.
        return
    case .restricted: // The user can't grant access due to restrictions.
        return
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.