Как узнать, готова ли камера iPhone к съемке?
Когда [camera takePicture]
вызывается до того, как камера готова, она выплевывает это сообщение:
UIImagePickerController: ignoring request to take picture; camera is not yet ready.
Как я могу узнать, когда он готов сделать снимок?
[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
всегда возвращает true, даже если он явно не готов.
Ответы
Ответ 1
Как сказал @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 рекомендует вам всегда проверять, что это возвращает Yes
, и что у вас есть делегат с номером nil (чтобы предоставить способ dismiss
сборщику через стандартный интерфейс), прежде чем пытаться инициализировать и представить контроллер.
Ответ 2
Честно говоря, я не пробовал, и документация несколько неоднозначна, но как насчет [UIImagePickerController isCameraDeviceAvailable:...]
?
EDIT: Как я только что узнал, это не решение вашей проблемы. Извините, я подумал, что стоит попробовать...
Ответ 3
То, что сказал @Alladinian, было наиболее полезным, этот ответ является дополнением к этому. Я рекомендую использовать его технику AVCaptureSessionDidStartRunningNotification, поскольку это говорит вам, когда камера готова (но это называется только один раз.) Я также обеспокоен тем, готов ли устройство к последующим снимкам. Я не нашел лучшего решения, потому что я не вижу никаких обратных вызовов для устройства, которые не относятся к сеансу камеры. Но эта функция обратного вызова кажется достаточно хорошей:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
Обратите внимание, что камера, скорее всего, будет готова до вызова обратного вызова, и вы можете вставить одну или две фотографии, но, похоже, камера будет готова к моменту вызова callback. Это должно помешать вам получить следующую ошибку между несколькими снимками камеры.
UIImagePickerController: ignoring request to take picture; image is already being captured or camera not yet ready.
Ответ 4
В соответствии с документацией для UIImagePickerController. Метод takePicture() снова готов, когда
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
. Если вы заинтересованы в блокировании снимков в течение этого периода времени, просто отключите интерфейс кнопки (button.userInterfaceEnabled = false), пока вызов не вернется со средой. Я решил эту проблему с помощью imagePickerController.
Ответ 5
Вот быстрая версия:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.cameraIsReady), name: AVCaptureSessionDidStartRunningNotification, object: nil)
func cameraIsReady(notification :NSNotification ) {
print("Camera is ready...")
}
Ответ 6
Если вы используете 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;
}
}
Ответ 7
Это позволит начать захват видео, как только камера будет готова
imgpicker = [[UIImagePickerController alloc] init];
[self presentViewController:imgpicker animated:YES completion:^(void){
while(![imgpicker startVideoCapture]);
}];