4

重複の可能性:
Android カメラが機能しない。startPreview が失敗する

カスタム SurfaceView でカメラ プレビューを設定しようとしていますが、初期化メソッドを実行するたびに例外が発生します。

以下は、カメラ プレビューの初期化のコードです。

private void init(Context context)
{
    setFocusable(true);
    mRecording = false;
    fileRW = new FileReaderWriter();
    frameCount = 0;
    if(mCamera == null)
    {
        mCamera = Camera.open();
    }
    Parameters parameters = mCamera.getParameters();
    parameters.setPictureFormat(PixelFormat.JPEG);
    mCamera.setParameters(parameters);
    try {
        mCamera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mCamera.startPreview();

}

メソッドを実行しようとするたびに、この行mCamera.setPreviewDisplay(surfaceHolder);は例外 ( ) をスローします。setPreviewDisplay failed

誰が何が間違っているのか知っていますか? 何かお役に立てば幸いです。

ありがとう!

4

2 に答える 2

7

私はジョン・ブライトに完全に同意します

1週間何が起こっているのか理解できませんでした.SDKが非推奨であると言ったため、サーフェスホルダーのsetTypeを無視しました。

「このメソッドは非推奨です。これは無視されます。この値は必要に応じて自動的に設定されます。」

しかし、そうしないと、setPreview でクラッシュします。これは、2.1のGalaxy Sで1.5 SDKを実行しています(それとの下位互換性が必要です)。そのため、必ずタイプを設定してください。ドキュメントが聞こえるほど自動ではありません。

于 2011-04-09T08:44:54.583 に答える
2

呼び出すのに最適な場所setPreviewDisplay()は、surfaceChanged()です。サーフェスが作成されたばかりの場合、surfaceChanged が少なくとも 1 回呼び出されstartPreview()、そこで PreviewDisplay を設定できます。サーフェスが変更され、プレビューが既に開始されている場合は、stopPreview/setPreviewDisplay/startPreviewそこに移動できます。アプリがサーフェスのサイズを変更しない場合でもsurfaceChanged()、アプリの開始時または終了時に、方向の変更によってフレームワークが予期せず呼び出されることがあります。したがって、アプリは surfaceChanged を適切に処理する必要があります。参考までにAndroidのカメラアプリのソースコードをたどることができます。

別の回答のコード スニペットはsurfaceChanged()、アプリのライフサイクルで 1 回だけ呼び出された場合に機能します。

于 2009-11-30T06:46:55.130 に答える