我的发现是一些设备需要使用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;
}
SurfaceView必须可见,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更新中是如此)是已知的问题(在手机端),并且在我的设备上不起作用。非常好的答案,timosch!
@android:style/Theme.Translucent.NoTitleBar
,这样SurfaceView
就完全不会显示。 - Muzikant