27

カメラの準備が整う前に[camera takePicture]が呼び出されると、次のメッセージが表示されます。

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

写真を撮る準備ができたことをどうやって知ることができますか?

[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]明らかに準備ができていない場合でも、常にtrueを返します。

4

7 に答える 7

46

@djromeroが言ったように、を使用することで解決策がありますAVFoundation(ただし、代わりにではありません 。通知を返すために使用するだけです)。UIImagePickerControllerAVFoundation

[[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標準インターフェイスを介してピッカーにアクセスする方法を提供するため)があることを常に確認する必要があることをお勧めします。

于 2012-05-26T17:05:46.090 に答える
1

正直なところ、私はそれを試していませんし、ドキュメントはやや曖昧ですが、どう[UIImagePickerController isCameraDeviceAvailable:...]ですか?

編集:私がちょうど学んだように、これはあなたの問題の解決策ではありません。申し訳ありませんが、試してみる価値があると思いました...

于 2012-05-21T00:42:53.310 に答える
0

@Alladinianが言ったことは最も役に立ちました、この答えはそれを補足するものです。彼のAVCaptureSessionDidStartRunningNotificationテクニックを使用することをお勧めします。これは、カメラの準備ができたときに通知するためです(ただし、これは1回だけ呼び出されます)。また、デバイスが後続の写真の準備ができているかどうかも気になります。カメラのセッションを参照していないデバイスのコールバックが表示されないため、最適な解決策が見つかりませんでした。しかし、このコールバック関数は十分に良いようです:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

カメラはそのコールバックが呼び出される前に準備ができている可能性が高く、1枚または2枚の写真を詰め込むことができますが、コールバックが呼び出されるまでにカメラは確実に準備ができているようです。これにより、複数のカメラショット間で次のエラーが発生するのを防ぐことができます。

UIImagePickerController: ignoring request to take picture; image is already being captured or camera not yet ready.
于 2013-07-04T16:54:32.883 に答える
0

UIImagePickerControllerのドキュメントによる。takePicture()メソッドは、次の場合に再び準備ができています。

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

と呼ばれます。この期間中に画像をブロックすることに興味がある場合は、通話がメディアとともに返されるまで、ボタンインターフェイス(button.userInterfaceEnabled = false)を無効にしてください。imagePickerControllerを使用してこの問題を解決しました。

于 2015-10-16T21:50:51.813 に答える
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 に答える
-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 に答える
-1

これにより、カメラの準備ができたらすぐにビデオのキャプチャを開始できます

imgpicker = [[UIImagePickerController alloc] init];  
[self presentViewController:imgpicker animated:YES completion:^(void){       
while(![imgpicker startVideoCapture]);
}];
于 2013-10-12T20:58:56.400 に答える