2011-01-14 11 views
3
私はAndroidのカメラのAPIで動作するようにしようとするには、次のURLで提供されたコードを使用しています

:これは私が無駄にしようとしたいくつかの質問を調達しているアンドロイド:いくつかのカメラの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) 

私はそこにカメラのリソースをリリースできないのですか?

ありがとうございます。このカメラのことが私をナットにしている。

P.S.私はこれをHTC Evoでテストしています。

答えて

1

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

8

(1)APIレベル9用に開発している場合は、developer websiteに掲載されているコードを試すことができます。あなたは次の操作を行うことを確認する必要がある(2)については

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

リリースを呼び出す基本的には()の前に、あなたがnullにsetPreviewCallbackする必要があります。

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

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

} 

はその後、onResume機能でカメラを再初期化:これは、カメラ・スタック、このコードを実行してください

0

の既知の問題です。

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; 
} 
関連する問題