iOS에서 카메라 권한 탐지
저는 매우 간단한 비디오 앱을 개발하고 있습니다.저는 공식 제어를 사용합니다. UIImagePickerController.
여기 문제가 있습니다.UIImagePickerController를 처음으로 표시할 때 iOS에서 권한을 요청합니다.사용자는 예 또는 아니오를 클릭할 수 있습니다.사용자가 아니오를 클릭해도 제어는 해제되지 않습니다.대신 사용자가 시작 단추를 계속 클릭하면 화면이 항상 검은색인 상태에서 타이머가 계속 작동하고 사용자는 타이머를 중지하거나 돌아갈 수 없습니다.사용자가 할 수 있는 유일한 일은 앱을 없애는 것입니다.다음 번에 UIImagePickerController가 표시될 때도 검은색 화면이며 시작을 클릭하면 사용자가 돌아갈 수 없습니다.
혹시 벌레가 아닌가 해서요.UIImagePickerController를 표시할지 여부를 결정할 수 있도록 카메라의 권한을 탐지할 수 있는 방법이 있습니까?
확인: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
}
스위프트 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를 키로 눌러 카메라 액세스를 요청할 수 있습니다. 그렇지 않으면 앱이 런타임에 충돌합니다.사용 설명이 필요한 API를 참조하십시오.
Apple Developer 포럼의 흥미로운 참고 사항:
사용자가 설정에서 카메라에 대한 앱 액세스를 전환하면 시스템이 실제로 앱을 종료합니다.Settings→Settings 섹션의 보호된 데이터 클래스에도 동일하게 적용됩니다.
스위프트 솔루션
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
})
@Raptor의 답변에 추가로 다음 사항이 언급되어야 합니다.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.
이 문제를 해결하려면 메인 스레드의 결과를 다음과 같이 처리해야 합니다(Swift 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
}
}
}
}
}
Info.plist에서 먼저 NSCameraUsageDescription 키를 지정합니다.그런 다음 Authorization(인증됨)인 경우 AV Authorization Status(AV 인증 상태)를 확인한 다음 UIImagePicker Controller(UI 이미지 선택 컨트롤러).그건 작동할 것이다.
Swift: AV Foundation 사용
- 대상에 AV Foundation 추가 -> 빌드 단계 -> 이진을 라이브러리와 연결합니다.
- ViewController에서 AVFoundation을 가져옵니다.
- Info.plist에서 다음을 추가합니다.
- View 컨트롤러에서:
@IBAction func cameraButtonClicked(발신자:모든 개체) {
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)
}
언급URL : https://stackoverflow.com/questions/20464631/detect-permission-of-camera-in-ios
'programing' 카테고리의 다른 글
아티팩트 com.oracle:ojdbc6:jar:11.2.0.3 누락 (0) | 2023.06.27 |
---|---|
MongoDB에서 각 문서의 마지막 업데이트 시간을 검색하는 방법은 무엇입니까? (0) | 2023.06.27 |
MongoDB 나침반을 이용한 데이터 정렬 방법 (0) | 2023.06.22 |
Visual Studio 코드는 git와의 병합 충돌을 해결하는 방법을 알려 주시겠습니까? (0) | 2023.06.22 |
git reset의 실용적인 사용 -- 소프트? (0) | 2023.06.22 |