2012-01-16 18 views
25

Così tante domande di API torcia a LED per Android. Ho paura di chiedere ancora un altro, ma qui va ..Torcia a LED su Galaxy Nexus controllabile tramite quale API?

Utilizzando il FLASH_MODE_TORCH provato e vero sono in grado di raggiungere la soddisfazione con il mio Samsung Galaxy SII e ottenere il flash LED acceso. Sul Galaxy Nexus del mio amico, non ho avuto tanta fortuna. Né sul mio Droid X.

Noto per un numero non trascurabile di dispositivi, sembrano essere richieste chiamate IOCTL native. È questo il caso del Galaxy Nexus? Come trovo un riferimento per programmarlo?

Sto facendo la catena standard FLASH_MODE_TORCH/"flash-mode" = "torch", startPreview().

Un po 'deludente che questa API apparentemente standard non sembri essere così universale dopo tutto.

risposta

44

Quello che ho scoperto è che alcuni dispositivi hanno bisogno di un SurfaceView per accendere il 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(); 

La vostra attività ha bisogno di implementare 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; 
} 

La SurfaceView deve essere visibile, android:visibility="invisible" o un altezza e larghezza pari a 0 non funzionerà. Sfortunatamente non ho trovato una buona soluzione per nasconderlo, quindi ho dato una dimensione di 1x1dip e l'ho posizionata sotto un pulsante ..

** (Per espandere sopra il paragrafo [Non ho abbastanza rep per rispondere, ma sentiva che era utile]) da qualche parte nel codice XML del contenuto corrente View, si vuole:

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

Se si dispone all'interno di un RelativeLayout (preferito), si può anche fare alignParentLeft/in basso a infilare in un angolo Questo metodo funziona per il mio Galaxy Nexus, ma è un problema noto (lato telefono) per Droid X (con l'aggiornamento .621, comunque) e non funziona sul mio. Ottima risposta, timosch!

+0

Ho intenzione di fare un tentativo. Grazie-- – Malachi

+0

ha funzionato? per chiunque? –

+0

ha funzionato? – Ivan

Problemi correlati