27

[camera takePicture]相机准备好之前调用时,它会输出以下消息:

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

我怎么知道什么时候可以拍照?

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

4

7 回答 7

46

正如@djromero 所说,有一个解决方案是使用AVFoundation(但不是 代替.UIImagePickerController你只是AVFoundation用来获取通知)。

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

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

- (void)cameraIsReady:(NSNotification *)notification
{   
    NSLog(@"Camera is ready...");
    // Whatever
}

我刚刚通过takePictureUIImagePickerController演示后调用(我收到“相机未准备好”消息)并在我的通知回调中调用它来测试它,它就像一个魅力。

旁注

[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]总是返回Yes,因为它只检查是否有可用的相机设备。事实上,Apple 建议您在尝试初始化和呈现控制器之前,始终必须检查 this 是否返回Yes,并且您有一个非 nil 委托(通过标准接口为选取器提供一种方式)。dismiss

于 2012-05-26T17:05:46.090 回答
1

老实说,我还没有尝试过,文档有些模棱两可,但是呢[UIImagePickerController isCameraDeviceAvailable:...]

编辑:正如我刚刚了解到的,这不是您问题的解决方案。对不起,我认为这可能值得一试......

于 2012-05-21T00:42:53.310 回答
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.
于 2013-07-04T16:54:32.883 回答
0

这是一个 Swift 版本:

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


func cameraIsReady(notification :NSNotification ) {
     print("Camera is ready...")
}
于 2016-12-05T04:53:50.487 回答
0

根据 UIImagePickerController 的文档。takePicture() 方法再次准备好

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

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

于 2015-10-16T21:50:51.813 回答
-1

这样可以确保在相机准备好后立即开始捕获视频

imgpicker = [[UIImagePickerController alloc] init];  
[self presentViewController:imgpicker animated:YES completion:^(void){       
while(![imgpicker startVideoCapture]);
}];
于 2013-10-12T20:58:56.400 回答
-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;
            }
        }
于 2013-02-26T12:13:09.273 回答