2015-12-13 12 views
12

Ich habe Probleme, das Gerät dazu zu bringen, ein Bild mit der Rückfahrkamera aufzunehmen, wenn der Näherungssensor aktiviert ist. Ich möchte nicht, dass die Kameravorschau angezeigt wird, sondern nur, dass das Gerät das Foto aufnimmt und es in der Bildansicht anzeigt. Ich habe die Näherungssensor arbeiten, und ich verwende imagePicker.takePicture(), um das Bild zu machen, wenn der Näherungssensor aktiviert ist, aber das scheint nicht zu funktionieren. Welche Methode/Funktion kann ich verwenden, um das Bild ohne Benutzereingabe programmgesteuert aufzunehmen?Wie mache ich ein Bild mit dem Näherungssensor?

Dies ist mein Code so weit:

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

Können Sie klären: welcher Teil funktioniert nicht? Wird der Näherungssensor ausgelöst, aber kein Bild oder überhaupt nicht oder etwas anderes? – TwoStraws

+0

Ja, der Näherungssensor wird ausgelöst, aber das Bild wird nicht aufgenommen. –

+0

Wäre es nicht besser, AVFoundation zu verwenden und den Bilderwähler überhaupt nicht zu durchlaufen? – matt

Antwort

2

Wenn Sie Probleme mit Fotos UIImagePickerController aufnehmen, schlage ich vor AVFoundation verwenden.

Unten ist ein funktionierendes Beispiel. Die Fotoaufnahme wird durch den Näherungssensor ausgelöst.

Sie können eine Vorschau hinzufügen, wenn Sie sie benötigen.

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 
    } 

}