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

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

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

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

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

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

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

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