iosswiftcameraphotolibraryphphotolibrary

Accessing the camera and photo library in swift 4


I'm trying to access both the camera and photo library in swift4 using the following code

let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    let alert = UIAlertController(title: "", message: "", preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: {(action: UIAlertAction) in
        imagePickerController.sourceType = .camera
        print(1)
    }))
    alert.addAction(UIAlertAction(title: "Photo Album", style: .default, handler: {(action: UIAlertAction) in
        imagePickerController.sourceType = .photoLibrary
    }))
    alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
    self.present(alert, animated: true, completion: nil)

but it's not working. I'm not get an access authorization request even though I made sure that the plist has the camera and photo library authorization. I manipulate the code a bit to the following

AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
    }
    let photos = PHPhotoLibrary.authorizationStatus()
    if photos == .notDetermined {
        PHPhotoLibrary.requestAuthorization({status in
        })
    }

    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    let alert = UIAlertController(title: "", message: "", preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: {(action: UIAlertAction) in
        imagePickerController.sourceType = .camera
        print(1)
    }))
    alert.addAction(UIAlertAction(title: "Photo Album", style: .default, handler: {(action: UIAlertAction) in
        imagePickerController.sourceType = .photoLibrary
    }))
    alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
    self.present(alert, animated: true, completion: nil)

Now I am getting the authorization request for both cameras and photo library and I can see the AlertView but when I press camera or Photo Album as shown in the picture nothing happens.

enter image description here

I tried on a device and simulator for the camera.


Solution

  • Here is the code to load image from photos & camera in iOS.

    ⁃ You need to create an outlet of your UIImageView

    ⁃ Then add a tap gesture on to image view

    ⁃ Then connect tap gesture with the didTapOnImageView function.

    ⁃ Then add the following extension to your view controller.

    //MARK:- Image Picker
    extension YourViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
        //This is the tap gesture added on my UIImageView.
        @IBAction func didTapOnImageView(sender: UITapGestureRecognizer) {
            //call Alert function
            self.showAlert()
        }
    
        //Show alert to selected the media source type.
        private func showAlert() {
    
            let alert = UIAlertController(title: "Image Selection", message: "From where you want to pick this image?", preferredStyle: .actionSheet)
            alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: {(action: UIAlertAction) in
                self.getImage(fromSourceType: .camera)
            }))
            alert.addAction(UIAlertAction(title: "Photo Album", style: .default, handler: {(action: UIAlertAction) in
                self.getImage(fromSourceType: .photoLibrary)
            }))
            alert.addAction(UIAlertAction(title: "Cancel", style: .destructive, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    
        //get image from source type
        private func getImage(fromSourceType sourceType: UIImagePickerController.SourceType) {
    
            //Check is source type available
            if UIImagePickerController.isSourceTypeAvailable(sourceType) {
    
                let imagePickerController = UIImagePickerController()
                imagePickerController.delegate = self
                imagePickerController.sourceType = sourceType
                self.present(imagePickerController, animated: true, completion: nil)
            }
        }
    
        //MARK:- UIImagePickerViewDelegate.
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
            self.dismiss(animated: true) { [weak self] in
    
                guard let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else { return }
                //Setting image to your image view
                self?.profileImgView.image = image
            }
        }
    
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            picker.dismiss(animated: true, completion: nil)
        }
    
    }
    

    Note: Don't forget to add the privacy settings in info.plist

    Privacy - Camera Usage Description

    Privacy - Photo Library Usage Description