Androidデバイスでカメラのフラッシュを制御する方法が必要です。ストロボライトアプリを作っていて、ストロボを点滅させてビデオを撮ると、ファンブレードのように高速で動いているオブジェクトを記録することができます。ビデオの録画中にカメラのフラッシュを有効にする
フラッシュは、ビデオプレビューを開始し、カメラのパラメータでFLASH_MODE_TORCHを設定することによってのみ有効にすることができます。これは次のようになります:
Camera c = Camera.open();
Camera.Parameters p = c.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(p);
c.startPreview();
プレビューが開始されたら、そのパラメータを前後に移動してライトをオンまたはオフにすることができます。これはビデオを録画しようとするまでうまく動作します。問題は、カメラをMediaRecorderに渡すために、私はまずそれをロック解除する必要があるということです。
MediaRecorder m = new MediaRecorder();
c.unlock(); // the killer
m.setCamera(c);
ロックが解除された後、カメラのパラメータを変更できなくなり、フラッシュの状態を変更することができなくなりました。
- Camera.unlockを()ネイティブです:
私がせいぜいここJavaは、ハッキングが、いないよので、これを実行することが実際に可能であるならば、私は知らないが、私が知っているものですこの方法は、私は本当にそれが出て私をロック方法の背後にあるメカニズムを見ることはできません
- Camera.Parameterは、そのパラメータ
- Camera.setParameters(パラメータ)の全てが含まれているHashMapを取るHashMapを持っているに変換文字列に変換し、それをネイティブメソッドに渡します。
- HashMapからTORCH-MODEを選択すると、カメラは引き続きそれを受け入れます。
私はまだカメラにアクセスできますが、私はそれを聞くことはできません。 (どのCamera.unlockの目的(の一種である))
編集:
ネイティブコードを調べた後、私はCamera.setParametersにCameraService.cpp私の呼び出し(パラメータ)であるため拒否され得ることを見ることができます私のプロセスIDは、カメラサービスが記録しているプロセスIDと一致しません。だから、それが私のハードルだと思われます。
EDIT2:
MediaPlayerServiceは、ビデオが録画されたときに、カメラの制御を取る主要サービスであるように思われます。私はそれが可能かどうかは分かりませんが、自分のプロセスで何とかそのサービスを開始できたら、Camera.unlock()呼び出しをスキップすることができます。
EDIT3:私は何とかCameraHardwareInterfaceへのポインタを取得することができれば
一つの最後のオプションは次のようになります。その外観から見ると、これはデバイス固有のインターフェイスであり、おそらくPIDチェックは含まれていません。しかし、この主な問題は、私がそれへのポインタを見つけることができる唯一の場所はCameraServiceであり、CameraServiceは話していないということです。
Edit4:(数ヶ月後に)
この時点で、私は私が最初に望んで行うことが可能ですとは思いません。私は、誰かがそれに答える機会を逃して質問を削除したくないのですが、私は積極的に答えを求めていません。 (ただし、有効な回答を受信することは素晴らしいだろう。)
これが可能だと思われる理由は本当にわかりません。私はビデオ録画がカメラの完全な制御を取ると思います。それは、他の何かがカメラを同時に制御できるようにするために特別なコーディングを必要とするでしょう。 –
私は完全に同意します、私はそれが可能であるとは思わない、どちらかといえば、誰かが奇跡的に方法を見つけるオフチャンスでこの時点で質問をここに残しているだけです。 – thepenguin77