LED фенерче на Galaxy Nexus може да се управлява от какъв API?

Толкова много въпроси за API за LED фенерче за Android. Страх ме е да попитам още нещо, но ето че...

Използвайки изпитания и истински FLASH_MODE_TORCH, мога да постигна удовлетворение от моя Samsung Galaxy SII и да включа LED светкавицата. На 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;
}

Изгледът на повърхността трябва да е видим, android:visibility="invisible" или височина и ширина 0 няма да работят. За съжаление не намерих добро решение да го скрия, така че просто му дадох размер 1x1 dip и го позиционирах под бутон.

**(За разширяване на горния абзац [Нямам достатъчно представители, за да отговоря, но смятам, че е полезно]) Някъде в XML на текущия ви изглед на съдържание искате:

<SurfaceView
    android:id="@+id/PREVIEW"
    android:layout_width="1dip"
    android:layout_height="1dip"/>

Ако го имате вътре в RelativeLayout (за предпочитане), можете също да направите alignParentLeft/Bottom, за да го приберете в ъгъла. Този метод работи за моя Galaxy Nexus, но е известен проблем (от страна на телефона) за Droid X (все пак с актуализацията .621) и не работи на моя. Страхотен отговор, timosch!

person timoschloesser    schedule 21.02.2012
comment
Ще опитам това. Благодаря-- - person Malachi; 24.02.2012
comment
да, но трябваше да добавя mHolder.addCallback(this) след SurfaceHolder mHolder = preview.getHolder(); Това също може да е полезно stackoverflow.com/questions/10734858/ - person shiraz; 18.09.2012
comment
И ако искам да включа фенерчето от джаджа, как трябва да направя в този случай? - person Viktor Apoyan; 13.12.2012
comment
Можете да зададете темата на дейността на @android:style/Theme.Translucent.NoTitleBar, така че SurfaceView изобщо да не се показва - person Muzikant; 24.10.2013
comment
Едно малко забележка. Няма нужда от setPreviewDisplay след 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