Каким API можно управлять светодиодным фонариком на Galaxy Nexus?

Так много вопросов по API светодиодных фонариков для Android. Боюсь еще спросить, но вот..

Используя проверенную и надежную FLASH_MODE_TORCH, я могу добиться удовлетворения от моего Samsung Galaxy SII и включить светодиодную вспышку. На Galaxy Nexus моего друга не повезло. Ни на Droid X моего друга.

Я заметил, что для значительного числа устройств, по-видимому, требуются определенные собственные вызовы IOCTL. Это касается Galaxy Nexus? Как мне найти ссылку, чтобы запрограммировать его?

Я делаю стандартную цепочку FLASH_MODE_TORCH/"flash-mode"="torch", startPreview().

Разочаровывает тот факт, что этот, казалось бы, стандартный API не кажется таким универсальным.


person Malachi    schedule 16.01.2012    source источник


Ответы (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;
}

Surfaceview должен быть видимым, 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) и не работает на моем. Отличный ответ, тимощ!

person timoschloesser    schedule 21.02.2012
comment
Я попробую. Спасибо-- - person Malachi; 24.02.2012
comment
да, однако мне пришлось добавить mHolder.addCallback(this) после SurfaceHolder mHolder = preview.getHolder(); Это также может быть полезно: - person shiraz; 18.09.2012
comment
И если я хочу включить фонарик из виджета, что мне делать в этом случае? - person Viktor Apoyan; 13.12.2012
comment
Вы можете установить тему Activity на @android:style/Theme.Translucent.NoTitleBar, чтобы SurfaceView вообще не отображалось. - person Muzikant; 24.10.2013
comment
Одно маленькое уведомление. Нет необходимости устанавливать PreviewDisplay после Camera.open. В документации сказано - Important: Pass a fully initialized SurfaceHolder to setPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview. - person w201; 14.02.2019