【问题标题】:How to know if iPhone camera is ready to take picture?如何知道 iPhone 相机是否准备好拍照?
【发布时间】:2012-05-20 23:28:05
【问题描述】:

在摄像头准备好之前调用[camera takePicture],它会输出以下消息:

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

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

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

【问题讨论】:

  • stackoverflow.com/questions/6817920/… 的类似问题 - 选择的答案不正确,但还有另一个答案是关于添加延迟。这可能是一个很好的起点。
  • 另外,请参阅stackoverflow.com/questions/4377303/… - 相机未准备好时似乎有返回码。检查结果,等待,然后重试。
  • 我当然希望延迟不是唯一的出路,尽管看起来确实如此。当然有更好的解决方案...
  • 你能定位 iOS 4+ 设备吗?有一个解决方案,但它需要 AVFoundation 而不是 UIImagePickerController。
  • 是的,我正在寻找至少 iOS 4.2.1。

标签: iphone uiimagepickercontroller


【解决方案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
}

我刚刚通过在 UIImagePickerController 演示后调用 takePicture(我收到“相机未准备好”消息)并在我的通知回调中对其进行了测试,它就像一个魅力一样工作。

旁注

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

【讨论】:

  • 很棒的答案。这非常有用。还没有机会插入它,但我从赞成票中假设它有效。谢谢阿拉丁!!!
  • @JamesSkidmore 不客气!事实上,这个非常有用,Apple 应该更好地记录它,或者至少在 UIImagePickerController 中提供更高级别的 api(例如通过委托方法)。
  • 这在 iOS 4.2.1 中不起作用。没有错误,只是永远不会执行回调方法。有什么想法吗?
  • @JamesSkidmore 嗯,这很奇怪。它肯定在 iOS5 中有效,并且文档指出该通知适用于 iOS4+。如果我发现什么,我会看看并告诉你。 (你已经导入了AVFoundation,对吧?)
  • 感谢 Alladinian。是的,AVFoundation 已导入,但仍无法正常工作。
【解决方案2】:

说实话我没有尝试过,文档也有些模糊,但是[UIImagePickerController isCameraDeviceAvailable:...]呢?

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

【讨论】:

  • 是的,很遗憾没有解决问题。谢谢 Stefan。
【解决方案3】:

@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.

【讨论】:

    【解决方案4】:

    根据 UIImagePickerController 的文档。当

    时,takePicture() 方法再次准备就绪
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    

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

    【讨论】:

      【解决方案5】:

      这是一个 Swift 版本:

      NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.cameraIsReady), name: AVCaptureSessionDidStartRunningNotification, object: nil)
      
      
      func cameraIsReady(notification :NSNotification ) {
           print("Camera is ready...")
      }
      

      【讨论】:

      • 现在是 NSNotification.Name.AVCaptureSessionDidStartRunning :)
      【解决方案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]);
        }];
        

        【讨论】:

          猜你喜欢
          • 2012-10-19
          • 1970-01-01
          • 1970-01-01
          • 2017-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-19
          • 1970-01-01
          相关资源
          最近更新 更多