12

camera2 APIを使用してサービスから写真を撮るアプリを作成しようとしています。

Camera2Basic サンプルに基づくフラグメントから、アプリで写真をうまく撮ることができます。

しかし、サービスに移動しようとすると、画像が正しくキャプチャされません。自動露出プリキャプチャ状態を超えて進行することはありません。

プレビューがないことによる問題に絞り込みました。Camera2Basicコードを取得してプレビューを削除することにより、テスト フラグメントをまとめましたが、同じ問題が発生します。

基本的にプレビュー用のコードを削除した Camera2Basic サンプルに基づいて、問題のあるテスト フラグメントをまとめました。ここにアップロードされたフラグメントコードhttp://pastebin.ca/3182401 .

onCaptureCompleted()コールバックを取得していますが、ここでカメラの自動露出状態を確認すると、まだCONTROL_AE_STATE_PRECAPTURE状態のままです。

カメラの状態の 1 つがまだキャプチャ前である場合にキャプチャが完了するというのは、私には意味がありません。

ここで何が起こっているのか知っている人はいますか?

4

2 に答える 2

1

ドキュメントには記載されていませんが、 onCaptureCompleted は実際には、プリキャプチャまたはオートフォーカス シーケンスが終了したときではなく、リクエストが送信されたときに呼び出されます。Camera2Basic は、プレビューがカメラの状態の常時モニターとして機能するため、常に実行されているプレビューに依存しています。これがないと、プリキャプチャ シーケンスが実際にいつ終了するかわかりません。

于 2015-11-25T23:44:18.720 に答える
0

mStateをキャプチャ前の状態として設定するロジックに欠陥があると思います

private void process(CaptureResult result) {
        switch (mState) {
            case STATE_PREVIEW: {
                // We have nothing to do when the camera preview is working normally.
                break;
            }
            case STATE_WAITING_LOCK: {
                Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
                if (afState == null) {
                    captureStillPicture();
                } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
                        CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
                    // CONTROL_AE_STATE can be null on some devices
                    Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                    if (aeState == null ||
                            aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
                        mState = STATE_PICTURE_TAKEN;
                        captureStillPicture();
                    } else {
                        runPrecaptureSequence();
                    }
                }
                break;
            }
            case STATE_WAITING_PRECAPTURE: {
                // CONTROL_AE_STATE can be null on some devices
                Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                if (aeState == null ||
                        aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
                        aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
                    mState = STATE_WAITING_NON_PRECAPTURE;
                }
                break;
            }
            case STATE_WAITING_NON_PRECAPTURE: {
                // CONTROL_AE_STATE can be null on some devices
                Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
                    mState = STATE_PICTURE_TAKEN;
                    captureStillPicture();
                }
                break;
            }
        }
    }

ケース STATE_WAITING_PRECAPTURE はまったく入力されますか?

于 2015-10-20T22:02:45.003 に答える