4

次の URL で提供されているコードを使用して、Android Camera API を操作しようとしています。

http://marakana.com/forums/android/examples/39.html

これにより、これまで答えを見つけるために無駄に試みたいくつかの質問が発生しました.

1) 私のアプリケーションは縦向きにする必要がありますが、私が見たすべてのコード例 (上記の URL に含まれています) はすべて横向きに依存しているようです。実際、これまで何を試しても、ランドスケープは避けられないようです。私は次のようにパラメータを強制しようとしましsurfaceCreated(...)た:

Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait");
parameters.set("rotation", "90");
camera.setParameters(parameters);

で同じことをやってみましたsurfaceChanged(...)。もちろん、次のように、マニフェストで向きを縦向きに設定しています。

android:screenOrientation="portrait"

私が間違っていることとそれを修正する方法について誰か提案がありますか?

2) もう 1 つの質問は、カメラ リソースの解放に関するものです。上記の記事のコードでは、surfaceDestroyed(...)メソッドで次のものが呼び出されます。

camera.stopPreview();
camera = null;

カメラ リソースを解放するものは何もないため、このアプリケーションを実行した後は、カメラを使用する後続のアプリケーションは動作しません。これを修正しようとして、次のようにリソースを解放する呼び出しを追加しました。

camera.stopPreview();
camera.release();
camera = null;

ただし、問題は、アプリケーションを閉じると、LogCat で次の例外を伴う「強制終了」が発生することです。

FATAL EXCEPTION: main
java.lang.RuntimeException: Method called after release()
    at android.hardware.Camera.setHasPreviewCallback(Native Method)
    at android.hardware.Camera.access$600(Camera.java:58)
    at android.hardware.Camera.$EventHandler.handleMessage(Camera.java:344)
    at android.os.Handler.dispatchMessage(Handler.java.99)
    at android.os.Looper.loop(Looper.java:144)
    at android.app.ActivityThread.main(ActivityThread.java:4937)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lanf.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)

そこでカメラリソースを解放できない理由を誰か教えてもらえますか?

よろしくお願いします。このカメラのことは私を夢中にさせています。

PS 私は HTC Evo でこれらすべてをテストしています。

4

4 に答える 4

8

(1) API レベル 9 向けに開発している場合は、開発者の Web サイトに掲載されているコードを試すことができます。

(2) については、次のことを確認する必要があります。

    if (mCamera != null) {
        mCamera.setPreviewCallback(null);
        mCamera.release();
        mCamera = null;
    }

基本的に release() を呼び出す前に、PreviewCallback を null に設定する必要があります。これは、カメラ スタックの既知の問題です。

于 2011-07-29T16:25:24.207 に答える
1

2 番目の質問について: ここで誰かが回避策を投稿しました。

于 2011-02-21T23:32:01.760 に答える
0
public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    mCamera.setPreviewCallback(null);
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
}
于 2015-01-01T08:14:35.750 に答える
0

次のコードを実行します。

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
    this.getHolder().removeCallback(this);
    mCamera.stopPreview();

    mCamera.release();
    mCamera = null;
  Log.e("surfaceDestroyed", "surfaceDestroyed");

}

その後、onResume機能でカメラを再初期化します。

于 2012-12-26T14:35:06.857 に答える