2016-11-24 1 views
1

Comme le titre le suggère, j'essaie d'accéder à l'appareil photo à l'intérieur d'une vue de mon extension d'application iMessage. Ce code fonctionne bien sur une application normale, mais rien ne s'affiche avec mon extension iMessage. J'ai aussi mis en place info.plist.Impossible d'accéder à la caméra à partir de l'application iMessage

Merci.

import UIKit 
import Messages 
import AVFoundation 

class MessagesViewController: MSMessagesAppViewController { 

@IBOutlet weak var cameraView: UIView! 

var session : AVCaptureSession? 
var stillImageOutput : AVCaptureStillImageOutput? 
var videoPreviewLayer : AVCaptureVideoPreviewLayer? 

var captureDevice : AVCaptureDevice? 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 

    alignment() 
} 

func alignment() { 

    cameraView.bounds.size.width = view.bounds.size.width/4 
    cameraView.bounds.size.height = cameraView.bounds.size.width 
    cameraView.layer.cornerRadius = cameraView.bounds.size.width/2 

} 

override func viewWillAppear(_ animated: Bool) { 

    session = AVCaptureSession() 
    session!.sessionPreset = AVCaptureSessionPresetPhoto 

    let videoDevices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) 

    for device in videoDevices! { 

     let device = device as! AVCaptureDevice 
     if device.position == AVCaptureDevicePosition.front { 

      captureDevice = device 

     } 

    } 

    //We will make a new AVCaptureDeviceInput and attempt to associate it with our backCamera input device. 
    //There is a chance that the input device might not be available, so we will set up a try catch to handle any potential errors we might encounter. 
    var error : NSError? 
    var input : AVCaptureDeviceInput! 
    do { 

     input = try AVCaptureDeviceInput(device: captureDevice) 

    } catch let error1 as NSError { 

     error = error1 
     input = nil 
     print(error!.localizedDescription) 

    } 

    if error == nil && session!.canAddInput(input) { 

     session!.addInput(input) 

     // The remainder of the session setup will go here... 

     stillImageOutput = AVCaptureStillImageOutput() 
     stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 

     if session!.canAddOutput(stillImageOutput) { 

      session!.addOutput(stillImageOutput) 

      //configure live preview here 

      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) 
      videoPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspect 
      videoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 

      cameraView.layer.addSublayer(videoPreviewLayer!) 

      session!.startRunning() 

     } 

    } 

} 

override func viewDidAppear(_ animated: Bool) { 
    videoPreviewLayer!.frame = cameraView.bounds 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Conversation Handling 

override func willBecomeActive(with conversation: MSConversation) { 
    // Called when the extension is about to move from the inactive to active state. 
    // This will happen when the extension is about to present UI. 

    // Use this method to configure the extension and restore previously stored state. 
} 

override func didResignActive(with conversation: MSConversation) { 
    // Called when the extension is about to move from the active to inactive state. 
    // This will happen when the user dissmises the extension, changes to a different 
    // conversation or quits Messages. 

    // Use this method to release shared resources, save user data, invalidate timers, 
    // and store enough state information to restore your extension to its current state 
    // in case it is terminated later. 
} 

override func didReceive(_ message: MSMessage, conversation: MSConversation) { 
    // Called when a message arrives that was generated by another instance of this 
    // extension on a remote device. 

    // Use this method to trigger UI updates in response to the message. 
} 

override func didStartSending(_ message: MSMessage, conversation: MSConversation) { 
    // Called when the user taps the send button. 
} 

override func didCancelSending(_ message: MSMessage, conversation: MSConversation) { 
    // Called when the user deletes the message without sending it. 

    // Use this to clean up state related to the deleted message. 
} 

override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) { 
    // Called before the extension transitions to a new presentation style. 

    // Use this method to prepare for the change in presentation style. 
} 

override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) { 
    // Called after the extension transitions to a new presentation style. 

    // Use this method to finalize any behaviors associated with the change in presentation style. 
} 

}

Répondre

2

Si vous souhaitez utiliser la caméra dans une vue dans l'extension de l'application iMessage, alors s'il vous plaît donner l'autorisation d'accès de la caméra dans les deux fichiers dans info.plist du projet et le fichier Info.plist de MessageExtension comme celui-ci :

en info.plist:

<key>NSCameraUsageDescription</key> 
<string>To take a pic.</string> 

Après l'autorisation de donner vous devez écrire la suite:

import UIKit 
import Messages 
import AVFoundation 


class MessagesViewController: MSMessagesAppViewController 
{ 

@IBOutlet weak var cameraView: UIView! 
@IBOutlet weak var CaptureBtn: UIButton! 
@IBOutlet weak var capturedImage: UIImageView! 

var captureSession: AVCaptureSession? 
var stillImageOutput: AVCaptureStillImageOutput? 
var previewLayer: AVCaptureVideoPreviewLayer? 

var captureDevice : AVCaptureDevice? 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    cameraView.frame = view.bounds 
    cameraView.translatesAutoresizingMaskIntoConstraints = true 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    captureSession = AVCaptureSession() 
    captureSession!.sessionPreset = AVCaptureSessionPresetPhoto 

    let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    var error: NSError? 
    var input: AVCaptureDeviceInput! 
    do { 
     input = try AVCaptureDeviceInput(device: backCamera) 
    } catch let error1 as NSError { 
     error = error1 
     input = nil 
    } 

    if error == nil && captureSession!.canAddInput(input) { 
     captureSession!.addInput(input) 

     stillImageOutput = AVCaptureStillImageOutput() 
     stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 
     if captureSession!.canAddOutput(stillImageOutput) { 
      captureSession!.addOutput(stillImageOutput) 

      previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
      previewLayer!.videoGravity = AVLayerVideoGravityResizeAspect 
      previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 
      cameraView.layer.addSublayer(previewLayer!) 

      captureSession!.startRunning() 
     } 
    } 

} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    previewLayer!.frame = cameraView.bounds 
} 
@IBAction func CaptureBtn_Pressed(_ sender: Any) 
{ 
    if let videoConnection = stillImageOutput!.connection(withMediaType: AVMediaTypeVideo) { 
     videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait 
     stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: {(sampleBuffer, error) in 
      if (sampleBuffer != nil) { 
       let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
       let dataProvider = CGDataProvider(data: imageData as! CFData) 
       let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent) 

       let image = UIImage(cgImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.right) 
       self.capturedImage.image = image 
      } 
     }) 
    } 
} 

override func didReceiveMemoryWarning() 
{ 
    super.didReceiveMemoryWarning() 
} 

// MARK: - Conversation Handling 

override func willBecomeActive(with conversation: MSConversation) 
{ 

} 

override func didResignActive(with conversation: MSConversation) 
{ 
} 

override func didReceive(_ message: MSMessage, conversation: MSConversation) 
{ 

} 

override func didStartSending(_ message: MSMessage, conversation: MSConversation) 
{ 
} 

override func didCancelSending(_ message: MSMessage, conversation: MSConversation) 
{ 

} 

override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) 
{ 

} 

override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) 
{ 

} 

}