IOS में कैमरे की अनुमति का पता लगाएं


143

मैं एक बहुत ही सरल वीडियो ऐप विकसित कर रहा हूं। मैं आधिकारिक नियंत्रण का उपयोग करता हूं: UIImagePickerController।

यहाँ समस्या है। पहली बार UIImagePickerController पेश करते समय, आईओएस अनुमति मांगेगा। उपयोगकर्ता हाँ या नहीं क्लिक कर सकता है। यदि उपयोगकर्ता कोई क्लिक करता है, तो नियंत्रण खारिज नहीं किया जाता है। इसके बजाय, यदि उपयोगकर्ता स्टार्ट बटन पर क्लिक करता रहता है, तो स्क्रीन के हमेशा काले रहने पर टाइमर चलते हैं, और उपयोगकर्ता टाइमर बंद नहीं कर सकता या वापस नहीं जा सकता। केवल एक चीज जो उपयोगकर्ता कर सकता है वह है ऐप को मारना। अगली बार जब UIImagePickerController प्रस्तुत किया जाता है, तो यह अभी भी एक काली स्क्रीन है और प्रारंभ होने पर उपयोगकर्ता वापस नहीं जा सकता है।

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


पुन :: यह एक बग है? IMHO, मुझे ऐसा लगता है, क्योंकि ऐसा प्रतीत होता है कि कुलपति हार्डवेयर से डेटा प्रदर्शित कर रहा है, लेकिन ओएस मूल रूप से हवा भेज रहा है। आईओएस कैसे मिला, यह शायद उत्पाद परिवार के विकास का एक दुष्प्रभाव है। UIImageViewControlleriOS 2.0 में जोड़े जाने के रूप में विख्यात है, और डॉक्स ने कभी नहीं दर्शाया है कि AVAuthorizationStatus का उपयोग किया जाना चाहिए, लेकिन किसी अन्य ढांचे में रहता है।
benc

जवाबों:


229

जाँच करें AVAuthorizationStatusऔर मामलों को ठीक से संभालें।

NSString *mediaType = AVMediaTypeVideo;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
if(authStatus == AVAuthorizationStatusAuthorized) {
  // do your logic
} else if(authStatus == AVAuthorizationStatusDenied){
  // denied
} else if(authStatus == AVAuthorizationStatusRestricted){
  // restricted, normally won't happen
} else if(authStatus == AVAuthorizationStatusNotDetermined){
  // not determined?!
  [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
    if(granted){
      NSLog(@"Granted access to %@", mediaType);
    } else {
      NSLog(@"Not granted access to %@", mediaType);
    }
  }];
} else {
  // impossible, unknown authorization status
}

19
यह भी आवश्यक है: #import <AVFoundation/AVFoundation.h>या इसी तरह के
Toblerpwn

9
संभवतया उपयोगी टिप - यदि आप ऐसे कोड का परीक्षण कर रहे हैं जो इसका उपयोग करता है, तो आप अपने ऐप को परीक्षण उपकरण से हटा नहीं सकते हैं और फिर फिर से इंस्टाल कर सकते हैं। ऐसा करने से उपयोगकर्ता के अनुरोध को फिर से जारी करने के लिए iOS नहीं होगा! हालांकि मेरे लिए यह काम Bundle IDकरना है कि मैं हर बार ऐप को बदलना चाहता हूं, क्योंकि मैं यह परीक्षण करना चाहता हूं। चूतड़ में दर्द, लेकिन कुछ, कम से कम। जब आप समाप्त कर लें, तो आईडी को वापस सेट करना याद रखें ;-)
बेंजीन

25
@ बैंजोन: बंडल आईडी बदलना अनावश्यक है। आप सेटिंग> जनरल> रीसेट पर जा सकते हैं और एक सेटिंग पा सकते हैं जो डिवाइस पर सभी अनुमति संकेतों को रीसेट कर देगा। दी, यह भी कष्टप्रद है क्योंकि यह आपके डिवाइस पर अन्य सभी ऐप्स को भी प्रभावित करता है। यदि केवल Apple सेटिंग-डेवलपमेंट सेक्शन में इसके लिए ऐप्स-विशिष्ट नियंत्रण जोड़ सकता है ...
KennyDeriemaeker

3
@KennyDeriemaeker :-) Apple जवाब दे सकता है कि हम परीक्षण के लिए समर्पित उपकरणों का उपयोग करने वाले हैं! मेरे लिए मेरे नियमित फोन को रीसेट करने के साइड इफेक्ट्स बहुत अच्छे थे। बंडल आईडी बदलना एक बहुत ही दर्दनाक विकल्प था। मुझे याद है कि इसे जमा करने से पहले ही वापस कर दिया जाएगा :-)
बेंजामिन

8
बस सुनिश्चित करें कि आप पूर्ण रीसेट नहीं करते हैं! बस गोपनीयता और स्थान सेटिंग रीसेट करना (iOS 8) पर्याप्त होगा।
कैनक्लेसैंडविच

81

स्विफ्ट 4 और नया

यह सुनिश्चित कर लें:

import AVFoundation

सभी संभावित अनुमति के लिए नीचे दिए गए कोड की जाँच करता है:

let cameraMediaType = AVMediaType.video
let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: cameraMediaType)
    
switch cameraAuthorizationStatus {
case .denied: break
case .authorized: break
case .restricted: break

case .notDetermined:
    // Prompting user for the permission to use the camera.
    AVCaptureDevice.requestAccess(for: cameraMediaType) { granted in
        if granted {
            print("Granted access to \(cameraMediaType)")
        } else {
            print("Denied access to \(cameraMediaType)")
        }
    }
}

IOS 10 के बाद से आपको NSCameraUsageDescriptionकैमरा एक्सेस के लिए सक्षम होने के लिए अपने Info.plist में कुंजी निर्दिष्ट करने की आवश्यकता है , अन्यथा आपका ऐप रनटाइम पर क्रैश हो जाएगा। उपयोग विवरणों की आवश्यकता एपीआई देखें ।


एक दिलचस्प पक्ष के रूप में, क्या आप जानते हैं कि सेटिंग में अपने कैमरा अनुमतियों को बदलते समय iOS ऐप को मार देता है?

Apple डेवलपर फोरम से:

सिस्टम वास्तव में आपके ऐप को मारता है यदि उपयोगकर्ता सेटिंग्स में कैमरे पर आपके ऐप की पहुंच को बढ़ाता है। यही सेटिंग → गोपनीयता अनुभाग में किसी भी संरक्षित डेटलाॅस पर लागू होता है।


कैमरा और फोटो गैलरी को अधिकृत करने के बारे में क्या ??
हजार इल्कुमिखी

4

स्विफ्ट समाधान

extension AVCaptureDevice {
    enum AuthorizationStatus {
        case justDenied
        case alreadyDenied
        case restricted
        case justAuthorized
        case alreadyAuthorized
        case unknown
    }

    class func authorizeVideo(completion: ((AuthorizationStatus) -> Void)?) {
        AVCaptureDevice.authorize(mediaType: AVMediaType.video, completion: completion)
    }

    class func authorizeAudio(completion: ((AuthorizationStatus) -> Void)?) {
        AVCaptureDevice.authorize(mediaType: AVMediaType.audio, completion: completion)
    }

    private class func authorize(mediaType: AVMediaType, completion: ((AuthorizationStatus) -> Void)?) {
        let status = AVCaptureDevice.authorizationStatus(for: mediaType)
        switch status {
        case .authorized:
            completion?(.alreadyAuthorized)
        case .denied:
            completion?(.alreadyDenied)
        case .restricted:
            completion?(.restricted)
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: mediaType, completionHandler: { (granted) in
                DispatchQueue.main.async {
                    if granted {
                        completion?(.justAuthorized)
                    } else {
                        completion?(.justDenied)
                    }
                }
            })
        @unknown default:
            completion?(.unknown)
        }
    }
}

और फिर इसका उपयोग करने के लिए आप करते हैं

AVCaptureDevice.authorizeVideo(completion: { (status) in
   //Your work here
})

कैमरा और फोटो गैलरी को अधिकृत करने के बारे में क्या ??
हजार इल्कुमिखी

2

@ रैप्टर से उत्तर के अतिरिक्त निम्नलिखित का उल्लेख किया जाना चाहिए। आपको iOS 10 से शुरू होने वाली निम्न त्रुटि प्राप्त हो सकती है:This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.

इसे ठीक करने के लिए, सुनिश्चित करें कि आप मुख्य धागे से परिणाम को संभालते हैं (स्विफ्ट 3):

private func showCameraPermissionPopup() {
    let cameraMediaType = AVMediaTypeVideo
    let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(forMediaType: cameraMediaType)

    switch cameraAuthorizationStatus {
    case .denied:
        NSLog("cameraAuthorizationStatus=denied")
        break
    case .authorized:
        NSLog("cameraAuthorizationStatus=authorized")
        break
    case .restricted:
        NSLog("cameraAuthorizationStatus=restricted")
        break
    case .notDetermined:
        NSLog("cameraAuthorizationStatus=notDetermined")

        // Prompting user for the permission to use the camera.
        AVCaptureDevice.requestAccess(forMediaType: cameraMediaType) { granted in
            DispatchQueue.main.sync {
                if granted {
                    // do something
                } else {
                    // do something else
                }
            }
        }
    }
}

अस्वीकृत होने की स्थिति में, अनुरोध विधि सफल नहीं होगी। आपको उपयोगकर्ता को सेटिंग्स में जाने और अनुमति देने के लिए मैन्युअल रूप से अलर्ट दिखाना होगा।
अब्दुल्ला उमेर

0

पहले Info.plist में NSCameraUsageDescription कुंजी निर्दिष्ट करें। तब AVAuthorizationStatus की जाँच करें यदि अधिकृत है तो UIImagePickerController प्रस्तुत करें। यह काम करेगा।


-4

स्विफ्ट: AVFoundation का उपयोग करना

  1. लक्ष्य में AVFoundation जोड़ें -> चरण बनाएँ -> पुस्तकालयों के साथ लिंक बाइनरी।
  2. ViewController पर आयात AVFoundation।
  3. Info.plist पर, निम्नलिखित जोड़ें:

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

  1. नियंत्रक देखें:

@Iction जंक्शन दुर्गन्ध कैमराबटन (प्रेषक: AnyObject) {

let authorizationStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
print(authorizationStatus.rawValue)

if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) ==  AVAuthorizationStatus.Authorized{
    self.openCameraAfterAccessGrantedByUser()
}
else
{
    print("No Access")

    dispatch_async(dispatch_get_main_queue()) { [unowned self] in
        AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted :Bool) -> Void in
            if granted == true
            {
                // User granted
                self.openCameraAfterAccessGrantedByUser()
            }
            else
            {
                // User Rejected
                  alertToEncourageCameraAccessWhenApplicationStarts()
            }
        });
    }
}


//Open camera

    func openCameraAfterAccessGrantedByUser()
    {
    if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)){
        self.cameraAndGalleryPicker!.sourceType = UIImagePickerControllerSourceType.Camera
        cameraAndGalleryPicker?.delegate = self
        cameraAndGalleryPicker?.allowsEditing =  false
        cameraAndGalleryPicker!.cameraCaptureMode = .Photo
        cameraAndGalleryPicker!.modalPresentationStyle = .FullScreen
        presentViewController(self.cameraAndGalleryPicker!, animated: true, completion: nil)
    }
    else
    {

    }
}

//Show Camera Unavailable Alert

func alertToEncourageCameraAccessWhenApplicationStarts()
    {
        //Camera not available - Alert
        let cameraUnavailableAlertController = UIAlertController (title: "Camera Unavailable", message: "Please check to see if it is disconnected or in use by another application", preferredStyle: .Alert)

let settingsAction = UIAlertAction(title: "Settings", style: .Destructive) { (_) -> Void in
    let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString)
    if let url = settingsUrl {
        dispatch_async(dispatch_get_main_queue()) {
            UIApplication.sharedApplication().openURL(url)
        }

    }
}
let cancelAction = UIAlertAction(title: "Okay", style: .Default, handler: nil)
cameraUnavailableAlertController .addAction(settingsAction)
cameraUnavailableAlertController .addAction(cancelAction)
self.window?.rootViewController!.presentViewController(cameraUnavailableAlertController , animated: true, completion: nil)
}

Info.plist प्रविष्टियों के साथ क्या है? स्रोत?
बिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.