在应用程序使用iOS9图片模式时拍摄照片时出现iOS NSInternalInconsistencyException

时间:2016-08-26 00:58:27

标签: ios objective-c iphone avcapturesession

我在尝试拍摄照片时遇到了崩溃(前置摄像头),只有在用户使用图片模式拍摄单独的应用视频时才会失败。如果用户没有图片中的视频,一切正常。崩溃发生在这一行:

def read_data_file(filename):
    file = open(filename, 'r')
    poll_data = []
    for data in file:
        data = data.strip('\n')
        data = data.split(',')
        poll_data.append(data)
    return poll_data


read_data_file('florida-gop.csv')

错误

[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {

我尝试检查手机在使用图片模式时是否通常无法拍照,但默认的iOS相机应用程序可以拍照(尽管它可能采用不同的拍摄方法)照片)。 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[AVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:completionHandler:] - inconsistent state.' stillImageOutput似乎设置得很好而且不是零。

以下是导致崩溃的代码,以防万一。

videoConnection

以后

avCaptureSession = [[AVCaptureSession alloc] init];
AVCaptureDevice* cameraDevice = [GS60_FriendFeed_ScreenshotSelfie_Preview_View frontFacingCameraIfAvailable];
avCaptureSession.sessionPreset = avCaptureSessionPresetString;

NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&error];
if (!input) {
    NSLog(@"ERROR: trying to open camera: %@", error);
}
[avCaptureSession addInput:input];
AVCaptureStillImageOutput* stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
[stillImageOutput setOutputSettings:outputSettings];
[avCaptureSession addOutput:stillImageOutput];
[avCaptureSession startRunning];

我希望能够拍摄照片,但如果在照片中打开时无法拍摄,那么知道如何检测到我们无法拍摄它仍然会有所帮助。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

确保连接已启用并启用

if (!videoConnection || !videoConnection.enabled || !videoConnection.active) {
    // Raise error here / warn user... 
    return;
}
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
AVCaptureVideoOrientation avcaptureOrientation = AVCaptureVideoOrientationPortrait;

答案 1 :(得分:3)

当捕获会话中断且无法启动时,可能会发生这种情况,这可以通过电话,闹钟,应用程序在iPad上的分屏或其他使用画中画模式的应用程序触发。 / p>

AVCaptureSessionWasInterrupted通知添加观察者是个好主意,这样您的应用就可以响应并提醒用户according to the reason

您可以在通知回调中检查原因:

notification.userInfo[AVCaptureSessionInterruptionReasonKey];

此外,您应该为AVCaptureSessionInterruptionEnded添加一个观察者,以便在中断结束时重新启动会话。

Apple has a great example了解其运作方式。