Светодиодный фонарик на Galaxy Nexus управляется каким API? - PullRequest
25 голосов
/ 16 января 2012

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

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

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

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

Вид разочаровывает, что этот, казалось бы, стандартный API, похоже, не настолько универсален.

1 Ответ

47 голосов
/ 21 февраля 2012

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

...