Linterna LED en Galaxy Nexus controlable por qué API?

Tantas preguntas API de linterna LED para Android. Temo preguntar otra más, pero aquí va …

Con el probado y verdadero FLASH_MODE_TORCH puedo obtener satisfacción con mi Samsung Galaxy SII y encender el flash LED. En Galaxy Nexus de mi amigo, no tuve tanta suerte. Ni en el Droid X de mi otro amigo.

Me doy cuenta de una cantidad no despreciable de dispositivos que parecen requerirse llamadas IOCTL nativas específicas. ¿Es este el caso del Galaxy Nexus? ¿Cómo puedo encontrar una referencia para progtwigrlo?

Estoy haciendo la cadena estándar FLASH_MODE_TORCH / “flash-mode” = “antorcha”, startPreview ().

Es decepcionante que esta API aparentemente estándar no parezca ser tan universal después de todo.

Lo que descubrí es que algunos dispositivos necesitan SurfaceView para encender el 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(); 

Su actividad necesita implementar 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 vista de superficie debe ser visible, android:visibility="invisible" o un alto y ancho de 0 no funcionará. Desafortunadamente no encontré una buena solución para ocultarlo, así que le di un tamaño de 1×1 y lo coloqué debajo de un botón.

** (Para expandir el párrafo anterior [No tengo suficiente representante para responder, pero sentí que era útil]) En algún lugar del XML de su Vista de contenido actual, desea:

  

Si lo tiene dentro de RelativeLayout (preferido), también puede hacer alignParentLeft / Bottom para acomodarlo en una esquina. Este método funciona para mi Galaxy Nexus, pero es un problema conocido (en el lado del teléfono) para Droid X (con la actualización .621, de todos modos), y no funciona en el mío. ¡Gran respuesta, timosch!