25

Android 的许多 LED 手电筒 API 问题。我害怕再问一个,但这里有..

使用久经考验的真正 FLASH_MODE_TORCH,我能够对我的三星 Galaxy SII 感到满意并打开 LED 闪光灯。在我朋友的 Galaxy Nexus 上,没有这样的运气。在我另一个朋友的 Droid X 上也没有。

我注意到似乎需要大量设备特定的本地 IOCTL 调用。Galaxy Nexus 是这种情况吗?我如何找到编程的参考?

我正在做标准的 FLASH_MODE_TORCH/"flash-mode"="torch", startPreview() 链。

有点令人失望的是,这个看似标准的 API 似乎并没有那么普遍。

4

1 回答 1

48

我发现有些设备需要 SurfaceView 才能打开 LED。

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"/>

如果你有它在一个相对布局(首选),你也可以做 alignParentLeft/Bottom 把它塞在角落里。这种方法适用于我的 Galaxy Nexus,但它是 Droid X 的一个已知问题(手机端)(无论如何都是 .621 更新),并且不适用于我的。很好的答案,timosch!

于 2012-02-21T15:00:57.493 回答