2012-01-16 13 views
25

Tak wiele pytań LED API dla Androida. Boję się zadać jeszcze jedno, ale tutaj idzie ..Latarka LED na Galaxy Nexus sterowana przez jakie API?

Korzystając ze sprawdzonego i prawdziwego FLASH_MODE_TORCH, jestem w stanie osiągnąć satysfakcję z mojego Samsunga Galaxy SII i włączyć lampę błyskową LED. Na Galaxy Nexus mojego przyjaciela nie ma takiego szczęścia. Ani na Droid X drugiego mojego przyjaciela.

Zauważam, że niewielka liczba urządzeń wydaje się być wymagana dla określonych macierzystych wywołań IOCTL. Czy tak jest w przypadku Galaxy Nexus? Jak znaleźć odniesienie do programowania?

Wykonuję standardowy tryb FLASH_MODE_TORCH/"flash-mode" = "latarka", startPreview().

To rozczarowujące, że ten pozornie standardowy interfejs API nie wydaje się tak uniwersalny.

Odpowiedz

44

Odkryłem, że niektóre urządzenia wymagają funkcji SurfaceView do włączenia diody LED.

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(); 

Twoja aktywność musi wdrożyć 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 musi być widoczny, android:visibility="invisible" lub wysokość i szerokość od 0 nie będzie działać. Niestety nie znalazłem dobrego rozwiązania, aby go ukryć, więc podałem mu rozmiar 1x1dip i umieściłem go pod przyciskiem.

** (Aby rozwinąć powyższy akapit [Nie ma wystarczającej liczby rep odpowiedzieć, ale że był użyteczny]) Gdzieś w XML aktualnej zawartości widoku, chcesz:

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

Jeśli masz go wewnątrz RelativeLayout (preferowany), można też zrobić alignParentLeft/dół, aby schować to w kącie. Ta metoda działa na moim Galaxy Nexusie, ale jest to znany problem (po stronie telefonu) dla Droid X (z aktualizacją .621, tak czy inaczej) i nie działa na moim. Świetna odpowiedź, timosch!

+0

Dam temu szansę. Dzięki - – Malachi

+0

czy to zadziałało? dla kazdego? –

+0

czy to zadziałało? – Ivan

Powiązane problemy