Cómo activar la luz del flash de la cámara de forma programática en Android?

Quiero encender sólo la luz del flash de la cámara (no con la vista previa de la cámara) de forma programática en Android. Busqué en Google, pero la ayuda que encontré me remitió a esta página

¿Alguien tiene algún vínculo o código de ejemplo?

Para esto debes hacer lo siguiente:

  1. Compruebe si la luz del flash está disponible o no?

  2. En caso afirmativo, apague / encienda

  3. Si no, entonces usted puede hacer lo que sea según su aplicación. necesariamente

Para comprobar la disponibilidad del flash en el dispositivo:

Puede utilizar los siguientes

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

Que devolverá true si un flash está disponible, false si no.

Consulte http://developer.android.com/reference/android/content/pm/PackageManager.html para obtener más información.

Para encender / apagar la linterna:

I googled hacia fuera y conseguido esto sobre android.permission.FLASHLIGHT. El permiso de los manifiestos de Android parece prometedor:

  <!-- Allows access to the flashlight --> <permission android:name="android.permission.FLASHLIGHT" android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" android:protectionLevel="normal" android:label="@string/permlab_flashlight" android:description="@string/permdesc_flashlight" /> 

A continuación, hacer uso de la cámara y establecer Camera.Parameters . El parámetro principal utilizado aquí es FLASH_MODE_TORCH .

p.ej.

Código Snippet para encender la luz del flash de la cámara.

 Camera cam = Camera.open(); Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); cam.setParameters(p); cam.startPreview(); 

Extracto de código para apagar la luz de la cámara.

  cam.stopPreview(); cam.release(); 

Acabo de encontrar un proyecto que utiliza este permiso. Compruebe el código src de configuración rápida. Aquí http://code.google.com/p/quick-settings/ (Nota: este enlace ya está roto)

Para ver directamente la linterna http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Nota: este enlace es Ahora roto)

Update6 También podría tratar de agregar un SurfaceView como se describe en esta respuesta LED linterna en Galaxy Nexus controlable por qué API? Esto parece ser la solución que funciona en muchos teléfonos.

Actualización 5 Actualización principal

He encontrado el enlace alternativo (para arriba los acoplamientos quebrados): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Ahora puede utilizar este acoplamiento. [Actualización: 14/9/2012 Este enlace está roto]

Actualización 1

Otro código OpenSource: http://code.google.com/p/torch/source/browse/

Actualización 2

Ejemplo de cómo activar el LED en un Motorola Droid: http://code.google.com/p/droidled/

Otro código de código abierto:

http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/

Actualización 3 (Widget para encender / apagar la cámara)

Si quieres desarrollar un widget que encienda o apague tu cámara, entonces debes referir mi widget de respuesta para encender / apagar la linterna de la cámara en android .

Actualización 4

Si desea establecer la intensidad de luz que emerge del LED de la cámara puede consultar ¿Puedo cambiar la intensidad del LED de un dispositivo Android? Nota completa. Tenga en cuenta que sólo los dispositivos HTC con raíz admiten esta función.

Cuestiones :

También hay algunos problemas al encender / apagar la linterna. p.ej. Para los dispositivos que no tienen FLASH_MODE_TORCH o incluso si lo tiene, entonces la linterna no se enciende, etc.

Normalmente, Samsung crea un montón de problemas.

Puede referirse a los problemas en la siguiente lista:

Utilizar linterna de cámara en Android

Activar / desactivar la luz de la cámara LED / flash en Samsung Galaxy Ace 2.2.1 y Galaxy Tab

Desde mi experiencia, si su aplicación está diseñada para trabajar tanto en orientación vertical como horizontal, debe declarar la variable cam como estática. De lo contrario, onDestroy() , que se llama en la orientación de conmutación, lo destruye pero no libera la cámara por lo que no es posible volver a abrirlo de nuevo.

 package com.example.flashlight; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.app.Activity; import android.content.pm.PackageManager; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { public static Camera cam = null;// has to be static, otherwise onDestroy() destroys it @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void flashLightOn(View view) { try { if (getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FLASH)) { cam = Camera.open(); Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); cam.setParameters(p); cam.startPreview(); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(getBaseContext(), "Exception flashLightOn()", Toast.LENGTH_SHORT).show(); } } public void flashLightOff(View view) { try { if (getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FLASH)) { cam.stopPreview(); cam.release(); cam = null; } } catch (Exception e) { e.printStackTrace(); Toast.makeText(getBaseContext(), "Exception flashLightOff", Toast.LENGTH_SHORT).show(); } } } 

Para manifestar tuve que poner esta línea

  <uses-permission android:name="android.permission.CAMERA" /> 

Desde http://developer.android.com/reference/android/hardware/Camera.html

Las líneas sugeridas arriba no funcionaban para mí.

Tengo la luz AutoFlash con tres simples pasos abajo.

  • Acabo de agregar el permiso de cámara y Flash en el archivo Manifest.xml
 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-feature android:name="android.hardware.camera.flash" android:required="false" /> 
  • En tu Código de cámara hazlo de esta manera.

     //Open Camera Camera mCamera = Camera.open(); //Get Camera Params for customisation Camera.Parameters parameters = mCamera.getParameters(); //Check Whether device supports AutoFlash, If you YES then set AutoFlash List<String> flashModes = parameters.getSupportedFlashModes(); if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO)) { parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); } mCamera.setParameters(parameters); mCamera.startPreview(); 
  • Build + Run -> Ahora vaya a Dim light area y Snap photo, debe obtener flash automático si el dispositivo es compatible.

Android Lollipop introdujo la API de la cámara2 y desaprobó la API de la cámara anterior. Sin embargo, el uso de la API obsoleta para activar el flash sigue funcionando y es mucho más sencillo que usar la nueva API.

Parece que la nueva API está pensada para su uso en aplicaciones dedicadas dedicadas de cámara completa y que sus arquitectos realmente no consideran casos de uso más simples como encender la linterna. Para hacer eso ahora, uno tiene que conseguir un CameraManager, crear un CaptureSession con una superficie ficticia, y finalmente crear e iniciar un CaptureRequest. Manejo de excepciones, limpieza de recursos y callbacks largos incluidos!

Para ver cómo activar la linterna en Lollipop y más reciente, eche un vistazo a FlashlightController en el proyecto AOSP (intente encontrar la más reciente como las API de uso más antiguo que se han modificado). No olvide establecer los permisos necesarios.


Android Marshmallow introdujo finalmente una forma sencilla de activar el flash con setTorchMode .

Código completo para la aplicación de la linterna androide

Manifiesto

  <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.user.flashlight" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

XML

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="OFF" android:id="@+id/button" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:onClick="turnFlashOnOrOff" /> </RelativeLayout> 

MainActivity.java

  import android.app.AlertDialog; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.security.Policy; public class MainActivity extends AppCompatActivity { Button button; private Camera camera; private boolean isFlashOn; private boolean hasFlash; Parameters params; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); if(!hasFlash) { AlertDialog alert = new AlertDialog.Builder(MainActivity.this).create(); alert.setTitle("Error"); alert.setMessage("Sorry, your device doesn't support flash light!"); alert.setButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); alert.show(); return; } getCamera(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isFlashOn) { turnOffFlash(); button.setText("ON"); } else { turnOnFlash(); button.setText("OFF"); } } }); } private void getCamera() { if (camera == null) { try { camera = Camera.open(); params = camera.getParameters(); }catch (Exception e) { } } } private void turnOnFlash() { if(!isFlashOn) { if(camera == null || params == null) { return; } params = camera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_TORCH); camera.setParameters(params); camera.startPreview(); isFlashOn = true; } } private void turnOffFlash() { if (isFlashOn) { if (camera == null || params == null) { return; } params = camera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(params); camera.stopPreview(); isFlashOn = false; } } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onPause() { super.onPause(); // on pause turn off the flash turnOffFlash(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onResume() { super.onResume(); // on resume turn on the flash if(hasFlash) turnOnFlash(); } @Override protected void onStart() { super.onStart(); // on starting the app get the camera params getCamera(); } @Override protected void onStop() { super.onStop(); // on stop release the camera if (camera != null) { camera.release(); camera = null; } } } 

En API 23 o superior (Android M, 6.0)

Encender el código

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = null; // Usually back camera is at 0 position. try { cameraId = camManager.getCameraIdList()[0]; camManager.setTorchMode(cameraId, true); //Turn ON } catch (CameraAccessException e) { e.printStackTrace(); } } 

Desactivar código

 camManager.setTorchMode(cameraId, false); 

Y Permisos

 <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.FLASHLIGHT"/> 

Hay diferentes maneras de acceder a Camera Flash en diferentes versiones de Android. Pocas APIs dejaron de funcionar en Lollipop y luego se cambió de nuevo en Marshmallow. Para superar esto, he creado una biblioteca simple que he estado utilizando en algunos de mis proyectos y está dando buenos resultados. Todavía está incompleto, pero puede intentar comprobar el código y encontrar las piezas que faltan. Aquí está el enlace – NoobCameraFlash .

Si sólo desea integrar en su código, puede utilizar gradle para eso. Aquí están las instrucciones (tomado directamente del archivo Readme) –

Paso 1. Agregue el repositorio JitPack a su archivo de compilación. Añadirlo en su raíz build.gradle al final de los repositorios:

 allprojects { repositories { ... maven { url "https://jitpack.io" } } } 

Paso 2. Agregue la dependencia

 dependencies { compile 'com.github.Abhi347:NoobCameraFlash:0.0.1' } 

Uso

Inicialice el singleton NoobCameraManager .

 NoobCameraManager.getInstance().init(this); 

Opcionalmente puede configurar el nivel de registro para el registro de depuración. El registro utiliza la biblioteca LumberJack . El LogLevel predeterminado es LogLevel.None

 NoobCameraManager.getInstance().init(this, LogLevel.Verbose); 

Después de eso sólo tiene que llamar al singleton para encender o apagar el flash de la cámara.

 NoobCameraManager.getInstance().turnOnFlash(); NoobCameraManager.getInstance().turnOffFlash(); 

Usted puede hacerse cargo del permiso de tiempo de ejecución para acceder a la Cámara usted mismo o puede permitir que la biblioteca lo haga por usted

 NoobCameraManager.getInstance().takePermissions(); 

Es fácil cambiar Flash también

 if(NoobCameraManager.getInstance().isFlashOn()){ NoobCameraManager.getInstance().turnOffFlash(); }else{ NoobCameraManager.getInstance().turnOnFlash(); } 

He implementado esta función en mi aplicación a través de fragmentos utilizando SurfaceView. El enlace a esta pregunta stackoverflow y su respuesta se puede encontrar aquí

Espero que esto ayude 🙂

En Marshmallow y arriba, el `setTorchMode () 'de CameraManager parece ser la respuesta. Esto funciona para mí:

  final CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() { @Override public void onTorchModeUnavailable(String cameraId) { super.onTorchModeUnavailable(cameraId); } @Override public void onTorchModeChanged(String cameraId, boolean enabled) { super.onTorchModeChanged(cameraId, enabled); boolean currentTorchState = enabled; try { mCameraManager.setTorchMode(cameraId, !currentTorchState); } catch (CameraAccessException e){} } }; mCameraManager.registerTorchCallback(torchCallback, null);//fires onTorchModeChanged upon register mCameraManager.unregisterTorchCallback(torchCallback); 

Cuando actualizé mi versión de SDK, el flash de la cámara dejó de funcionar con una excepción de puntero nulo. Encontré que tuve que fijar el targetSDKVersion a 22 en el build.gradle Cuando intenté 23 la aplicación se estrelló.

  targetSdkVersion 22 

También puede utilizar el siguiente código para desactivar el flash.

 Camera.Parameters params = mCamera.getParameters() p.setFlashMode(Parameters.FLASH_MODE_OFF); mCamera.setParameters(params); 
  • Android ACTION_IMAGE_CAPTURE a veces no llama aActivityResult
  • Cámara2 grabación de vídeo
  • Snooker Aplicación para Android
  • ¿Cómo puedo guardar la imagen de la cámara?
  • Android - crear una cámara virtual o sobrescribir el flujo real de la leva? (/ Dev / msm_camera / frame0, v4l2loopback)?
  • Java libgdx mover la cámara de perspectiva
  • Obtener Ruta de la imagen desde ACTION_IMAGE_CAPTURE Propósito
  • ¿Qué es SurfaceView SurfaceHolder Superficie de la cámara API android
  • Rotación inexplicable de la cámara Android en la captura de algunos dispositivos (no en EXIF)
  • escala de previsualización de la cámara para adaptarse a la mitad de la pantalla
  • ¿Está correctamente documentada la CameraInfo.orientation de Android? ¿Implementado incorrectamente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.