Я обнаружил, что некоторым устройствам необходим 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, во всяком случае), и не работает на моем. Отличный ответ, Тимош!