यह लिखने की कोशिश कर रहा है:
if usergavepermissiontousercamera
opencamera
else
showmycustompermissionview
इस सरल कार्य को करने का वर्तमान तरीका नहीं मिल सका।
नोट: iOS7 को काम करना चाहिए भले ही इसके लिए अलग तरीके की आवश्यकता हो
यह लिखने की कोशिश कर रहा है:
if usergavepermissiontousercamera
opencamera
else
showmycustompermissionview
इस सरल कार्य को करने का वर्तमान तरीका नहीं मिल सका।
नोट: iOS7 को काम करना चाहिए भले ही इसके लिए अलग तरीके की आवश्यकता हो
जवाबों:
आप ऐसा करने के लिए निम्न कोड का उपयोग कर सकते हैं:
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
}
})
}
ध्यान दें:
AVFoundation
बिल्ड चरणों के लिंक बाइनरी अनुभाग में फ्रेमवर्क जोड़ते हैं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
}
})
}
if AVCaptureDevice.authorizationStatus(for: .video) == .authorized {
//already authorized
} else {
AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
if granted {
//access allowed
} else {
//access denied
}
})
}
स्विफ्ट 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)
}
निम्नलिखित स्विफ्ट 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
, तो वर्तमान उपयोगकर्ता इसे सक्षम करने में सक्षम नहीं हो सकता है, लेकिन आपको उन्हें कुछ मार्गदर्शन प्रदान करना चाहिए।
यह कैमरा तब खुलेगा जब उपयोगकर्ता द्वारा अनुमति दी जाएगी। अन्यथा अनुमति मांगने के लिए सतर्क रहें।
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)
}
मैंने उपरोक्त उत्तर को संशोधित किया है और प्रारंभिक प्रॉम्प्ट को हटा दिया है, क्योंकि जब हम डिवाइस के कैमरे का उपयोग करना चाहते हैं, तो सिस्टम अनुमतियों के लिए संकेत दे रहा है:
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)
}
आप 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
}