web-dev-qa-db-ja.com

Galaxy NexusのLED懐中電灯はどのAPIで制御できますか?

Androidには非常に多くのLED懐中電灯APIに関する質問があります。さらに別の質問をするのは怖いですが、ここに行きます。

実証済みのFLASH_MODE_TORCHを使用して、Samsung Galaxy SIIに満足し、LEDフラッシュをオンにすることができます。私の友人のギャラクシーネクサスでは、そのような運はありません。私の他の友人のDroidXにもありません。

特定のネイティブIOCTL呼び出しが必要と思われるデバイスの数がそれほど多くないことに気づいています。これはGalaxyNexusの場合ですか?プログラムのリファレンスを見つけるにはどうすればよいですか?

標準のFLASH_MODE_TORCH/"flash-mode" = "torch"、startPreview()チェーンを実行しています。

この一見標準的なAPIが、結局のところそれほど普遍的ではないように見えるのは、ちょっと残念です。

25
Malachi

私が見つけたのは、一部のデバイスではLEDをオンにするためにSurfaceViewが必要であるということです。

SurfaceView preview = (SurfaceView) findViewById(R.id.PREVIEW);
SurfaceHolder mHolder = preview.getHolder();
mHolder.addCallback(this);
Camera mCamera = Camera.open();
mCamera.setPreviewDisplay(mHolder);

// Turn on LED  
Parameters params = mCamera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);      
mCamera.startPreview();

...

// Turn off LED
Parameters params = mCamera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
mCamera.stopPreview();
mCamera.release();

アクティビティはSurfaceHolder.Callbackを実装する必要があります。

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {}

public void surfaceCreated(SurfaceHolder holder) {
    mHolder = holder;
    mCamera.setPreviewDisplay(mHolder);
}

public void surfaceDestroyed(SurfaceHolder holder) {
    mCamera.stopPreview();
    mHolder = null;
}

サーフェスビューが表示されている必要があります、Android:visibility="invisible"または高さと幅が0の場合は機能しません。残念ながら、非表示にするための適切な解決策が見つからなかったため、1x1dipのサイズを指定し、ボタンの下に配置しました。

**(上記の段落を拡張するには[返信するのに十分な担当者がいないが、役に立ったと感じた])現在のコンテンツビューのXMLのどこかに、次のようにします。

<SurfaceView
    Android:id="@+id/PREVIEW"
    Android:layout_width="1dip"
    Android:layout_height="1dip"/>

RelativeLayout(推奨)内にある場合は、alignParentLeft/Bottomを実行して、コーナーに配置することもできます。この方法は私のGalaxyNexusで機能しますが、Droid X(とにかく.621アップデートを使用)の既知の問題(電話側)であり、私の場合は機能しません。素晴らしい答えです、ティモッシュ!

47
timoschloesser