我发现有些设备需要 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!