【发布时间】:2016-10-03 16:23:27
【问题描述】:
当然,对于 iOS 10,您现在必须这样做
使用手机的相机。首次启动时,用户会收到一个问题,例如,
一切都很好。
但是我们有一个“相机应用”的客户端应用:当您启动应用时它会立即启动相机,当应用运行时相机正在运行并全屏显示。这样做的代码是通常的方式,见下文。
问题是 - 在手机上首次启动应用程序时,会询问用户问题;用户说是的。但是,在我们尝试过的设备上,相机只是黑色的。它不会崩溃(就像你忘记了 plist 项一样),但它会变黑并保持黑色。
如果用户退出应用程序并再次启动它 - 没关系,一切正常。
“相机应用”的工作流程到底是什么?我看不到一个好的解决方案,但必须有一个适用于各种相机应用的解决方案 - 立即进入全屏启动应用时的相机。
class CameraPlane:UIViewController
{
...
func cameraBegin()
{
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 )
{
print("probably on simulator? no camera?")
return;
}
if ( captureSession!.canAddInput(input) == false )
{
print("capture session problem?")
return;
}
captureSession!.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if ( captureSession!.canAddOutput(stillImageOutput) == false )
{
print("capture session with stillImageOutput problem?")
return;
}
captureSession!.addOutput(stillImageOutput)
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
// or, AVLayerVideoGravityResizeAspect
fixConnectionOrientation()
view.layer.addSublayer(previewLayer!)
captureSession!.startRunning()
previewLayer!.frame = view.bounds
}
【问题讨论】:
-
你应该在获得权限后初始化相机,像这样
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if(status == AVAuthorizationStatusAuthorized)else[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { [self performSelectorOnMainThread:@selector(initializeCamera) withObject:nil waitUntilDone:NO]; }];