Подтвердить что ты не робот

Как узнать, готова ли камера iPhone к съемке?

Когда [camera takePicture] вызывается до того, как камера готова, она выплевывает это сообщение:

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

Как я могу узнать, когда он готов сделать снимок?

[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] всегда возвращает true, даже если он явно не готов.

4b9b3361

Ответ 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]);
}];