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!
Ho intenzione di fare un tentativo. Grazie-- – Malachi
ha funzionato? per chiunque? –
ha funzionato? – Ivan