Това, което разбрах е, че някои устройства се нуждаят от 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 няма да работят. За съжаление не намерих добро решение да го скрия, така че просто му дадох размер 1x1 dip и го позиционирах под бутон.
**(За разширяване на горния абзац [Нямам достатъчно представители, за да отговоря, но смятам, че е полезно]) Някъде в XML на текущия ви изглед на съдържание искате:
<SurfaceView
android:id="@+id/PREVIEW"
android:layout_width="1dip"
android:layout_height="1dip"/>
Ако го имате вътре в RelativeLayout (за предпочитане), можете също да направите alignParentLeft/Bottom, за да го приберете в ъгъла. Този метод работи за моя Galaxy Nexus, но е известен проблем (от страна на телефона) за Droid X (все пак с актуализацията .621) и не работи на моя. Страхотен отговор, timosch!
person
timoschloesser
schedule
21.02.2012