Odkryłem, że niektóre urządzenia wymagają funkcji SurfaceView do włączenia diody 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();
Twoja aktywność musi wdrożyć 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 musi być widoczny, android:visibility="invisible"
lub wysokość i szerokość od 0 nie będzie działać. Niestety nie znalazłem dobrego rozwiązania, aby go ukryć, więc podałem mu rozmiar 1x1dip i umieściłem go pod przyciskiem.
** (Aby rozwinąć powyższy akapit [Nie ma wystarczającej liczby rep odpowiedzieć, ale że był użyteczny]) Gdzieś w XML aktualnej zawartości widoku, chcesz:
<SurfaceView
android:id="@+id/PREVIEW"
android:layout_width="1dip"
android:layout_height="1dip"/>
Jeśli masz go wewnątrz RelativeLayout (preferowany), można też zrobić alignParentLeft/dół, aby schować to w kącie. Ta metoda działa na moim Galaxy Nexusie, ale jest to znany problem (po stronie telefonu) dla Droid X (z aktualizacją .621, tak czy inaczej) i nie działa na moim. Świetna odpowiedź, timosch!
Dam temu szansę. Dzięki - – Malachi
czy to zadziałało? dla kazdego? –
czy to zadziałało? – Ivan