From 5def8cb54397f56c22b33301ca6bd2b7e4dc4980 Mon Sep 17 00:00:00 2001 From: Natalia Terlecka Date: Thu, 19 Mar 2015 10:54:23 +0000 Subject: [PATCH] Camera state returned when adding the preview layer. --- README.md | 4 +-- camera/CameraManager.swift | 53 ++++++++++++++++++++++++------------- camera/ViewController.swift | 7 ++++- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index a797b3c..8c1917d 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ####Camera Manager -V1.0.9 (10-Mar-2015) +V1.0.10 (19-Mar-2015) ####About This is a simple swift class to provide all the configurations you need to create custom camera view in your app. @@ -21,7 +21,7 @@ pod 'CameraManager', '~> 1.0' ``` ####How to use -To use it you just add the preview layer to your desired view +To use it you just add the preview layer to your desired view, you'll get back the state of the camera if it's unavailable, ready or the user denied assess to it. ```swift CameraManager.sharedInstance.addPreeviewLayerToView(self.cameraView) ``` diff --git a/camera/CameraManager.swift b/camera/CameraManager.swift index b897152..48d75ec 100644 --- a/camera/CameraManager.swift +++ b/camera/CameraManager.swift @@ -12,6 +12,10 @@ import AssetsLibrary private let _singletonSharedInstance = CameraManager() +public enum CameraState { + case Ready, AccessDenied, NoDeviceFound +} + public enum CameraDevice { case Front, Back } @@ -209,27 +213,33 @@ public class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { :param: view The view you want to add the preview layer to :param: cameraOutputMode The mode you want capturesession to run image / video / video and microphone + + :returns: Current state of the camera: Ready / AccessDenied / NoDeviceFound. */ - public func addPreviewLayerToView(view: UIView) + public func addPreviewLayerToView(view: UIView) -> CameraState { - self.addPreviewLayerToView(view, newCameraOutputMode: _cameraOutputMode) + return self.addPreviewLayerToView(view, newCameraOutputMode: _cameraOutputMode) } - public func addPreviewLayerToView(view: UIView, newCameraOutputMode: CameraOutputMode) + public func addPreviewLayerToView(view: UIView, newCameraOutputMode: CameraOutputMode) -> CameraState { - if let validEmbedingView = self.embedingView? { - if let validPreviewLayer = self.previewLayer? { - validPreviewLayer.removeFromSuperlayer() + let currentCameraState = _checkIfCameraIsAvailable() + if currentCameraState == .Ready { + if let validEmbedingView = self.embedingView? { + if let validPreviewLayer = self.previewLayer? { + validPreviewLayer.removeFromSuperlayer() + } } - } - if self.cameraIsSetup { - self._addPreeviewLayerToView(view) - self.cameraOutputMode = newCameraOutputMode - } else { - self._setupCamera({ Void -> Void in + if self.cameraIsSetup { self._addPreeviewLayerToView(view) self.cameraOutputMode = newCameraOutputMode - }) + } else { + self._setupCamera({ Void -> Void in + self._addPreeviewLayerToView(view) + self.cameraOutputMode = newCameraOutputMode + }) + } } + return currentCameraState } /** @@ -471,7 +481,7 @@ public class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { private func _setupCamera(completition: Void -> Void) { - if self._checkIfCameraIsAvailable() { + if self._checkIfCameraIsAvailable() == .Ready { self.captureSession = AVCaptureSession() dispatch_async(sessionQueue, { @@ -492,8 +502,6 @@ public class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { completition() } }) - } else { - self._show("Camera unavailable", message: "The device does not have a camera") } } @@ -523,10 +531,19 @@ public class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { }) } - private func _checkIfCameraIsAvailable() -> Bool + private func _checkIfCameraIsAvailable() -> CameraState { let deviceHasCamera = UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Rear) || UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front) - return deviceHasCamera + if deviceHasCamera { + let userAgreedToUseIt = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) == .Authorized + if userAgreedToUseIt { + return .Ready + } else { + return .AccessDenied + } + } else { + return .NoDeviceFound + } } private func _addVideoInput() diff --git a/camera/ViewController.swift b/camera/ViewController.swift index 89ac41a..1820c4c 100644 --- a/camera/ViewController.swift +++ b/camera/ViewController.swift @@ -25,7 +25,12 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - self.cameraManager.addPreviewLayerToView(self.cameraView, newCameraOutputMode: CameraOutputMode.StillImage) + let currentCameraState = self.cameraManager.addPreviewLayerToView(self.cameraView, newCameraOutputMode: CameraOutputMode.VideoOnly) + if currentCameraState == .AccessDenied { + UIAlertView(title: "Camera access denied", message: "You need to go to settings app and grant acces to the camera device to use it.", delegate: nil, cancelButtonTitle: "OK").show() + } else if (currentCameraState == .NoDeviceFound) { + UIAlertView(title: "Camera unavailable", message: "The device does not have a camera.", delegate: nil, cancelButtonTitle: "OK").show() + } self.cameraManager.cameraDevice = .Front self.imageView.hidden = true