在相机准备好之前调用[camera takePicture]
时,它会发出此消息:
UIImagePickerController: ignoring request to take picture; camera is not yet ready.
我怎么知道它何时可以拍照?
[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
总是返回true,即使它显然没有准备好。
答案 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]);
}];