25

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

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

重要でない数のデバイス固有のネイティブ IOCTL 呼び出しが必要と思われることに気付きました。これは、Galaxy Nexus の場合ですか? それをプログラムするための参照を見つけるにはどうすればよいですか?

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

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

4

1 に答える 1

48

私が見つけたのは、一部のデバイスは 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 を実行してコーナーに押し込むこともできます。この方法は私のGalaxy Nexusでは機能しますが、Droid X(とにかく.621アップデートを使用)の既知の問題(電話側)であり、私のものでは機能しません. 素晴らしい答え、ティモッシュ!

于 2012-02-21T15:00:57.493 に答える