在[camera takePicture]
相机准备好之前调用时,它会输出以下消息:
UIImagePickerController: ignoring request to take picture; camera is not yet ready.
我怎么知道什么时候可以拍照?
[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
总是返回 true,即使它显然还没有准备好。
在[camera takePicture]
相机准备好之前调用时,它会输出以下消息:
UIImagePickerController: ignoring request to take picture; camera is not yet ready.
我怎么知道什么时候可以拍照?
[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
总是返回 true,即使它显然还没有准备好。
正如@djromero 所说,有一个解决方案是使用AVFoundation
(但不是 代替.UIImagePickerController
你只是AVFoundation
用来获取通知)。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(cameraIsReady:)
name:AVCaptureSessionDidStartRunningNotification object:nil];
然后,一旦相机准备好,您就会收到通知:
- (void)cameraIsReady:(NSNotification *)notification
{
NSLog(@"Camera is ready...");
// Whatever
}
我刚刚通过takePicture
在UIImagePickerController
演示后调用(我收到“相机未准备好”消息)并在我的通知回调中调用它来测试它,它就像一个魅力。
旁注:
[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
总是返回Yes
,因为它只检查是否有可用的相机设备。事实上,Apple 建议您在尝试初始化和呈现控制器之前,始终必须检查 this 是否返回Yes
,并且您有一个非 nil 委托(通过标准接口为选取器提供一种方式)。dismiss
老实说,我还没有尝试过,文档有些模棱两可,但是呢[UIImagePickerController isCameraDeviceAvailable:...]
?
编辑:正如我刚刚了解到的,这不是您问题的解决方案。对不起,我认为这可能值得一试......
@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.
这是一个 Swift 版本:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.cameraIsReady), name: AVCaptureSessionDidStartRunningNotification, object: nil)
func cameraIsReady(notification :NSNotification ) {
print("Camera is ready...")
}
根据 UIImagePickerController 的文档。takePicture() 方法再次准备好
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
叫做。如果您有兴趣在此期间阻止图片,只需禁用按钮界面 (button.userInterfaceEnabled = false),直到调用返回媒体。我使用 imagePickerController 解决了这个问题。
这样可以确保在相机准备好后立即开始捕获视频
imgpicker = [[UIImagePickerController alloc] init];
[self presentViewController:imgpicker animated:YES completion:^(void){
while(![imgpicker startVideoCapture]);
}];
如果您使用的是 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;
}
}