Светодиодный фонарик на Galaxy Nexus управляется каким API?
Так много вопросов по API светодиодных фонариков для Android. Я боюсь спросить еще один, но здесь идет..
Используя проверенный и проверенный FLASH_MODE_TORCH, я могу добиться удовлетворения от работы с Samsung Galaxy SII и включить светодиодную вспышку. На галактике 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, во всяком случае), и не работает на моем. Отличный ответ, Тимош!