Ответ 1
Что я узнал, так это то, что некоторым устройствам требуется 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, во всяком случае) и не работает на моем. Отличный ответ, тимош!