Доступ к камере и библиотеке фотографий в Swift 4 - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь получить доступ к камере и библиотеке фотографий в swift4, используя следующий код

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)

, но он не работает.Я не получаю запрос на авторизацию доступа, хотя я удостоверился, что у plist есть камера и авторизация библиотеки фотографий.Я немного манипулирую кодом для следующего

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)

Теперь я получаю запрос на авторизацию для камер и библиотеки фотографий, и я вижу AlertView, но когда я нажимаю камеру или фотоальбом, как показано на рисункеничего не происходит.

enter image description here

Я примерил устройство и симулятор для камеры.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Ошибка: вам нужно представить imagePickerViewController.Здесь я даю модифицированный код для решения вашей проблемы.Я также добавил некоторые проверки.

 //Show alert
func showAlert() {

    let alert = UIAlertController(title: "", message: "", 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: .default, handler: nil))
    self.present(alert, animated: true, completion: nil)
}

//get image from source type
func getImage(fromSourceType sourceType: UIImagePickerControllerSourceType) {

    //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)
    }
}

Примечание. Не забудьте добавить настройки конфиденциальности в info.plist

Конфиденциальность - описание использования камеры

Конфиденциальность -Описание использования библиотеки фотографий

0 голосов
/ 19 сентября 2018

Прежде всего вам необходимо импортировать эту библиотеку:

import Photos
import UserNotifications
import UIKit

 @IBOutlet weak var loadPhoto: UIButton!

И вам нужны делегаты настройки:

class YourClass: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UNUserNotificationCenterDelegate 

func displayUploadImageDialog(btnSelected: UIButton) {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    let alertController = UIAlertController(title: "", message: "Upload profile photo?".localized(), preferredStyle: .actionSheet)
    let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: "Cancel action"), style: .cancel, handler: {(_ action: UIAlertAction) -> Void in
        alertController.dismiss(animated: true) {() -> Void in }
    })
    alertController.addAction(cancelAction)
    let cameraRollAction = UIAlertAction(title: NSLocalizedString("Open library".localized(), comment: "Open library action"), style: .default, handler: {(_ action: UIAlertAction) -> Void in
        if UI_USER_INTERFACE_IDIOM() == .pad {
            OperationQueue.main.addOperation({() -> Void in
                picker.sourceType = .photoLibrary
                self.present(picker, animated: true) {() -> Void in }
            })
        }
        else {
            picker.sourceType = .photoLibrary
            self.present(picker, animated: true) {() -> Void in }
        }
    })
    alertController.addAction(cameraRollAction)
    alertController.view.tintColor = .black
    present(alertController, animated: true) {() -> Void in }
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage
    profileImage.image = image
    let imageData = UIImageJPEGRepresentation(image, 0.05)
    self.dismiss(animated: true, completion: nil)
}

func checkPermission() {
    let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
    switch authStatus {
    case .authorized:
        self.displayUploadImageDialog(btnSelected: self.loadPhoto)
    case .denied:
        print("Error")
    default:
        break
    }
}

func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    self.dismiss(animated: true, completion: nil)
}

func checkLibrary() {
    let photos = PHPhotoLibrary.authorizationStatus()
    if photos == .authorized {
        switch photos {
        case .authorized:
            self.displayUploadImageDialog(btnSelected: self.loadPhoto)
        case .denied:
            print("Error")
        default:
            break
        }
    }
}

Действие установки для кнопки:

@IBAction func loadPhotoTapped(_ sender: UIButton) {
    let photos = PHPhotoLibrary.authorizationStatus()
    if photos == .notDetermined {
        PHPhotoLibrary.requestAuthorization({status in
            if status == .authorized{
                print("OKAY")
            } else {
                print("NOTOKAY")
            }
        })
    }
    checkLibrary()
    checkPermission()
}

При настройке Info.plist разрешения:

Конфиденциальность - описание использования библиотеки мультимедиа

Конфиденциальность - описание использования библиотеки фотографий

Конфиденциальность - описание использования камеры

Это должно работать.

...