如何知道iPhone相机是否准备拍照?

时间:2012-05-20 23:28:05

标签: iphone uiimagepickercontroller

在相机准备好之前调用[camera takePicture]时,它会发出此消息:

UIImagePickerController: ignoring request to take picture; camera is not yet ready.

我怎么知道它何时可以拍照?

[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]总是返回true,即使它显然没有准备好。

7 个答案:

答案 0 :(得分:46)

正如@djromero所说,有一个解决方案是使用AVFoundation(但 而不是UIImagePickerController。你只需使用{{1}收到通知回复)。

AVFoundation

然后,一旦相机准备就绪,您就收到了通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(cameraIsReady:)
                                             name:AVCaptureSessionDidStartRunningNotification object:nil];

我刚刚在- (void)cameraIsReady:(NSNotification *)notification { NSLog(@"Camera is ready..."); // Whatever } 演示文稿之后调用takePicture进行了测试(我得到了'相机未准备就绪'消息)并且正好在我的通知回调中,它就像魅力一样。< / p>

旁注

UIImagePickerController始终返回[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera],因为它只会检查是否有可用的摄像头设备。事实上,Apple建议您在尝试之前必须检查这是否返回Yes并且您有一个非零委托(通过标准界面提供Yes选择器的方法)初始化并呈现控制器。

答案 1 :(得分:1)

老实说,我没有尝试过,文档有些含糊不清,但是[UIImagePickerController isCameraDeviceAvailable:...]怎么办?

编辑:正如我刚刚了解到的,这不是解决问题的方法。对不起,我觉得值得一试......

答案 2 :(得分:0)

@Alladinian所说的最有帮助的,这个答案是对此的补充。我建议使用他的AVCaptureSessionDidStartRunningNotification技术,因为它告诉你最初相机何时就绪(但只调用一次。)我也关心设备是否准备好后续图片。我没有找到最佳解决方案,因为我没有看到任何不参考相机会话的设备的回叫。但是这个回调函数似乎已经足够好了:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

请注意,在调用回叫之前,相机很可能已经准备就绪,您可以填写一张或两张照片,但看起来在调用回调时相机肯定会准备就绪。这样可以避免多次拍摄之间出现以下错误。

UIImagePickerController: ignoring request to take picture; image is already being captured or camera not yet ready.

答案 3 :(得分:0)

根据UIImagePickerController的文档。

时,takePicture()方法再次准备就绪
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

被调用。如果您对在此时间段内阻止图片感兴趣,只需禁用按钮界面(button.userInterfaceEnabled = false),直到调用返回媒体。我使用imagePickerController解决了这个问题。

答案 4 :(得分:0)

这是一个Swift版本:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.cameraIsReady), name: AVCaptureSessionDidStartRunningNotification, object: nil)


func cameraIsReady(notification :NSNotification ) {
     print("Camera is ready...")
}

答案 5 :(得分:-1)

如果您正在使用UIImagePickerController,以下是视频代码,类似的代码也暗示图像。

UIImagePickerController *picker;
BOOL cameraIsOn;

然后检查可用的相机设备

if ([UIImagePickerController isCameraDeviceAvailable:[picker cameraDevice]]) {
            if (cameraIsOn) {
                NSLog(@"stop camera");
                [picker stopVideoCapture];
                cameraIsOn = FALSE;
            }
            else {
                NSLog(@"start camera");
                [picker startVideoCapture];
                self.videoTimer =  [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeValue) userInfo:nil repeats:YES];
                cameraIsOn = TRUE;
            }
        }

答案 6 :(得分:-1)

这确保在相机准备就绪后立即开始捕捉视频

imgpicker = [[UIImagePickerController alloc] init];  
[self presentViewController:imgpicker animated:YES completion:^(void){       
while(![imgpicker startVideoCapture]);
}];