2015-12-13 3 views
12

J'ai des difficultés à faire prendre une photo à l'appareil en utilisant la caméra de vue arrière lorsque le capteur de proximité est activé. Je ne veux pas que l'aperçu de la caméra apparaisse, je veux juste que l'appareil prenne la photo et la présente dans l'imageView. J'ai le capteur de proximité de travail, et j'utilise imagePicker.takePicture() pour prendre l'image lorsque le capteur de proximité est activé, mais cela ne semble pas fonctionner. Quelle est la méthode/fonction que je peux utiliser pour programmer l'image sans l'intervention de l'utilisateur.Comment prendre une photo avec le capteur de proximité?

Ceci est mon code à ce jour:

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { 

@IBOutlet var imageView: UIImageView! 

var imagePicker: UIImagePickerController! 

//*The function in question* 
func proximityChanged(notification: NSNotification) { 
    let device = notification.object as? UIDevice 
    if device?.proximityState == true { 
     print("\(device) detected!") 
+0

Pourriez-vous préciser: quelle partie ne fonctionne pas? Est-ce que le capteur de proximité est déclenché mais pas d'image, ou n'est-ce pas déclenché du tout, ou autre chose? – TwoStraws

+0

Oui, le capteur de proximité est déclenché mais l'image n'est pas prise. –

+0

Ne serait-il pas préférable d'utiliser AVFoundation et de ne pas passer par le sélecteur d'images? – matt

Répondre

2

Si vous avez des problèmes avec la capture de photos UIImagePickerController, je suggère d'utiliser AVFoundation.

Ci-dessous un exemple de travail. La capture de photo est déclenchée par le capteur de proximité.

Vous pouvez ajouter un aperçu si vous en avez besoin.

import UIKit 
import AVFoundation 

final class CaptureViewController: UIViewController { 

    @IBOutlet weak var imageView: UIImageView! 

    private static let captureSessionPreset = AVCaptureSessionPresetPhoto 
    private var captureSession: AVCaptureSession! 
    private var photoOutput: AVCaptureStillImageOutput! 
    private var initialized = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     initialized = setupCaptureSession() 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     if initialized { 
      captureSession.startRunning() 
      UIDevice.currentDevice().proximityMonitoringEnabled = true 
      NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(proximityStateDidChange), name: UIDeviceProximityStateDidChangeNotification, object: nil) 
     } 
    } 

    override func viewDidDisappear(animated: Bool) { 
     super.viewDidDisappear(animated) 
     if initialized { 
      NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceProximityStateDidChangeNotification, object: nil) 
      UIDevice.currentDevice().proximityMonitoringEnabled = false 
      captureSession.stopRunning() 
     } 
    } 

    dynamic func proximityStateDidChange(notification: NSNotification) { 
     if UIDevice.currentDevice().proximityState { 
      captureImage() 
     } 
    } 

    // MARK: - Capture Image 

    private func captureImage() { 
     if let c = findConnection() { 
      photoOutput.captureStillImageAsynchronouslyFromConnection(c) { sampleBuffer, error in 
       if let jpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer), 
        let image = UIImage(data: jpeg) 
       { 
        dispatch_async(dispatch_get_main_queue()) { [weak self] in 
         self?.imageView.image = image 
        } 
       } 
      } 
     } 
    } 

    private func findConnection() -> AVCaptureConnection? { 
     for c in photoOutput.connections { 
      let c = c as? AVCaptureConnection 
      for p in c?.inputPorts ?? [] { 
       if p.mediaType == AVMediaTypeVideo { 
        return c 
       } 
      } 
     } 
     return nil 
    } 

    // MARK: - Setup Capture Session 

    private func setupCaptureSession() -> Bool { 
     captureSession = AVCaptureSession() 
     if captureSession.canSetSessionPreset(CaptureViewController.captureSessionPreset) { 
      captureSession.sessionPreset = CaptureViewController.captureSessionPreset 
      if setupCaptureSessionInput() && setupCaptureSessionOutput() { 
       return true 
      } 
     } 
     return false 
    } 

    private func setupCaptureSessionInput() -> Bool { 
     if let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo), 
      let captureDeviceInput = try? AVCaptureDeviceInput.init(device: captureDevice) 
     { 
      if captureSession.canAddInput(captureDeviceInput) { 
       captureSession.addInput(captureDeviceInput) 
       return true 
      } 
     } 
     return false 
    } 

    private func setupCaptureSessionOutput() -> Bool { 
     photoOutput = AVCaptureStillImageOutput() 
     photoOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 
     if captureSession.canAddOutput(photoOutput) { 
      captureSession.addOutput(photoOutput) 
      return true 
     } 
     return false 
    } 

}