4

私は次のAndroidコードを持っています(ここでは疑似コードで書かれています):

mCamera = configAndInitialize(); //all I want to do before taking picture
mCamera.startPreview();
mCamera.torchOn(); //setting parameters with flash mode torch

onClick(){
    mCamera.stopPreview();
    mCamera.takePicture();
    mCamera.torchOff();
}

時々 (電話が最近再起動され、このアプリまでカメラが使用されていなかった場合)、このコードはエラー 100 カメラ サーバーが死亡した状態で終了します。カメラが正常に動作する前に写真を撮った場合。

私はそれをかなりの時間デバッグしていましたが、トーチで行をコメントアウトすると機能することがわかりました。写真を撮るときとそうでないときの両方のケースでトーチが機能しているのを見ることができます。

torchOn のコードは次のとおりです。

if(mCamera != null){
    mCamera.stopPreview();
    Camera.Parameters p = mCamera.getParameters();
    List<String> supported = p.getSupportedFlashModes();
    if (supported.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
      p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    }
    mCamera.setParameters(p);
    mCamera.startPreview();
}

トーチが原因で写真を撮ることができなかった理由はありますか? Motorola Razr と Samsung Galaxy SIII で発生したことを確認しました。

このアプリの 2 つのバージョンをデバイスにインストールしました (別の名前など)。そして、私は次のことを行います:

  1. デバイスを再起動する
  2. app-with-torch を試してみた
  3. app-with-torch がポイント 1 で機能する場合。
  4. app-without-torch を試してみた
  5. app-with-torch を試してみた

そして、結果は次のとおりです。

  1. トーチなしのアプリは常に機能します
  2. 試行の約 80% で app-with-torch がポイント 2 で機能しません。 (再起動後)
  3. app-with-torch はポイント 5 で常に機能します (app-without-torch が使用された後)。

写真を撮る直前に torchOff() を追加しても、アプリが動作し始めます。

4

2 に答える 2

2

これを「Monty Python Dead Parrot Log.d answer」と呼ぶことができます:-PI 解決策があればいいのですが、いくつか提案があります。ハイゼンバグは捕まえにくい。

トーチには isOn() テストがありますか?
同様に (思い出せません)、カメラには isReady() テストがありますか?

mCamera.torchOn() または .torchOff() の前、最中、または後にカメラが停止した場合、ログからわかりますか?

通話間の時間を延長するとどうなりますか? これは実際のアプリでは使用できませんが、何が起こっているかを監視して把握するのに役立つ場合があります。疑似コードで次のように言います。

  try {
    // Log.d ("cam", "here 1") ;
    mCamera = configAndInitialize();
    // Log.d ("cam", "here 2");
    if ( mCamera.isReady() ) {  // or isConfigured / initialized 
       // Log.d ("cam", "here 2");
       Camera.startPreview();
       // Log.d ("cam", "here 2");
       thisThread.setDelay (200); // millisecs. try even up to 2000 ms !
       // Log.d ("cam", "here 4");
       mCamera.torchOn();
       // Log.d ("cam", "here 5");
       thisThread.setDelay (200); // again up to 2000 ms
       // Log.d ("cam", "here 6");
    }
  } catch (Exception e) {
    Log.d ("oops!", e.toString() );   
  }

監視または確認するもう 1 つのことは、onClick が起動する前に、カメラとトーチが本当に準備ができていることです。Log.d のような遅延をあちこちに散らしてみてください。コールバックが必要になる場合があります (mCamera.isReady() で onClick を有効にします)。

もう 1 つやるべきことは、カメラのソース コード (またはトーチ) とエラー 100 の GREP を掘り下げることができるかどうかを確認することです。それとも、一般的な android 100 ですか?

そのカメラが作動したときにどれだけ多くのことが起こるか、あなたはよく知っていると思います - 何百もの呼び出しのように思えます. これらの低レベルの項目の一部は非同期であるため (cam は結局のところハードウェアです)、NPE または不十分に初期化されたオブジェクトを取得していると思われます。すべての NPE などがトラップされるわけではないため、遅延シーケンスまたは同期化シーケンスが使用されている場合に存在しない NPE で停止する可能性があります。

( HTH - お困りのことと思います、アリ、私は最近多くのカメラ関連の作業を行わなければなりませんでした。Samsung SIII でのデバッグは非常に時間がかかります。)

[編集] おそらくすでにこのリンクを見つけているでしょうが、念のため:

Androidでプログラムでカメラのフラッシュライトをオンにする方法は?

于 2013-08-28T16:03:48.720 に答える
1

これは、各 OEM の Android カメラ HAL (Hardware Abstraction Layer) の実装に関連していると思います。この問題は私にも起こりました。確かではありませんが、ほとんどのカメラ HAL のトーチ モードはビデオ キャプチャでのみ機能すると思われます。トーチをオンにしてビデオを録画して確認してください。

考えられる回避策の 1 つは、写真を撮る直前にカメラのフラッシュ モードを FLASH_MODE_ON に設定し、写真を撮った後に再度必要になった場合に FLASH_MODE_TORCH に戻すことです。

于 2013-09-02T08:40:44.650 に答える