Comment activer la lumière du flash avant par programmation dans Android?


233

Je veux activer la lumière du flash avant (pas avec l'aperçu de l'appareil photo) par programme dans Android. J'ai cherché sur Google, mais l'aide que j'ai trouvée m'a renvoyé à cette page

Quelqu'un at-il des liens ou un exemple de code?

Réponses:


401

Pour ce problème, vous devez:

  1. Vérifiez si la lampe de poche est disponible ou non?

  2. Si c'est le cas, désactivez / activez

  3. Sinon, vous pouvez faire quoi que ce soit, selon les besoins de votre application.

Pour vérifier la disponibilité du flash dans l'appareil:

Vous pouvez utiliser les éléments suivants:

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

qui retournera vrai si un flash est disponible, faux sinon.

Voir:
http://developer.android.com/reference/android/content/pm/PackageManager.html pour plus d'informations.

Pour allumer / éteindre la lampe de poche:

Je suis allé sur Google et j'ai obtenu ceci sur android.permission.FLASHLIGHT. La permission des manifestes Android semble prometteuse:

 <!-- 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" />

Ensuite, utilisez Camera et définissez Camera.Parameters . Le paramètre principal utilisé ici est FLASH_MODE_TORCH .

par exemple.

Extrait de code pour allumer la lampe de poche de l'appareil photo.

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

Extrait de code pour éteindre la lumière LED de la caméra.

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

Je viens de trouver un projet qui utilise cette autorisation. Vérifiez le code src des paramètres rapides. ici http://code.google.com/p/quick-settings/ (Remarque: ce lien est maintenant rompu)

Pour Flashlight, regardez directement http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Remarque: ce lien est maintenant cassé)

Update6 Vous pouvez également essayer d'ajouter une SurfaceView comme décrit dans cette réponse lampe de poche LED sur Galaxy Nexus contrôlable par quelle API? Cela semble être une solution qui fonctionne sur de nombreux téléphones.

Update 5 Major Update

J'ai trouvé un lien alternatif (pour les liens cassés ci-dessus): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Vous pouvez maintenant utiliser ce lien. [Mise à jour: 14/9/2012 Ce lien est maintenant rompu]

Mise à jour 1

Un autre code OpenSource: http://code.google.com/p/torch/source/browse/

Update 2

Exemple montrant comment activer la LED sur un Motorola Droid: http://code.google.com/p/droidled/

Un autre code Open Source:

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

Mise à jour 3 (Widget pour allumer / éteindre la LED de la caméra)

Si vous souhaitez développer un widget qui allume / éteint la LED de votre appareil photo, vous devez vous référer à ma réponse Widget pour allumer / éteindre la lampe de poche de la caméra dans Android ..

Mise à jour 4

Si vous souhaitez définir l'intensité de la lumière émise par la LED de la caméra, vous pouvez vous reporter à Puis-je modifier l'intensité de la LED d'un appareil Android? poste complet. Notez que seuls les appareils HTC enracinés prennent en charge cette fonctionnalité.

** Problèmes:**

Il y a aussi quelques problèmes lors de l'allumage / extinction de la lampe de poche. par exemple. pour les appareils ne disposant pas FLASH_MODE_TORCHou même s'il en a, alors la lampe de poche ne s'allume pas, etc.

En règle générale, Samsung crée de nombreux problèmes.

Vous pouvez vous référer aux problèmes dans la liste ci-dessous:

Utiliser une lampe de poche pour appareil photo dans Android

Allumez / éteignez la LED de la caméra / la lumière du flash dans Samsung Galaxy Ace 2.2.1 et Galaxy Tab


2
Merci pour votre aide, ça marche pour moi! - Je viens de copier l'interface Flashlight et la classe HtcLedFlashlight puis j'appelle juste la méthode setOn avec true / false HtcLedFlashlight et ça. --- Interface-Flashlight code.google.com/p/quick-settings/source/browse/trunk/… - Class-HtcLedFlashlight code.google.com/p/quick-settings/source/browse/trunk/…
saiket

1
@saiket: bienvenue .. si votre problème est résolu, marquez cette réponse comme résolue. pour qu'il puisse être utile aux autres ..
Kartik Domadiya

1
@PolamReddyRajaReddy: Je pense que vous testez dans Samsung Device. Ai-je raison ?
Kartik Domadiya

7
pour les autorisations, le code correct dans le fichier manifeste est: `<uses-permission android: name =" android.permission.CAMERA "/> <uses-permission android: name =" android.permission.FLASHLIGHT "/>`
ixeft

1
Utilisez également: - camera.release ();
Chetan

35

D'après mon expérience, si votre application est conçue pour fonctionner à la fois en orientation portrait et paysage, vous devez déclarer la variable camcomme statique. Sinon, onDestroy()ce qui est appelé à changer d'orientation, le détruit mais ne libère pas la caméra, il n'est donc pas possible de la rouvrir à nouveau.

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

pour manifester je devais mettre cette ligne

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

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

les lignes suggérées ci-dessus ne fonctionnaient pas pour moi.


Vous n'avez pas besoin de vérifier la fonctionnalité du système si la caméra est éteinte. Si cam! = Null, il était activé
Greg Ennis

1
La partie la plus utile pour moi a étéyou need to declare the variable cam as static
Alex Jolig

Lorsque vous importez une Cameraclasse, AndroidStudio faites attention à être une android.hardwareclasse ...
AN

32

Dans API 23 ou supérieur (Android M, 6.0)

Activer le code

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

Désactiver le code

camManager.setTorchMode(cameraId, false);

Et autorisations

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

MODIFICATION SUPPLÉMENTAIRE

Les gens votant toujours pour ma réponse, j'ai donc décidé de publier du code supplémentaire.C'était ma solution pour le problème à l'époque:

public class FlashlightProvider {

private static final String TAG = FlashlightProvider.class.getSimpleName();
private Camera mCamera;
private Camera.Parameters parameters;
private CameraManager camManager;
private Context context;

public FlashlightProvider(Context context) {
    this.context = context;
}

private void turnFlashlightOn() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        try {
            camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
            String cameraId = null; 
            if (camManager != null) {
                cameraId = camManager.getCameraIdList()[0];
                camManager.setTorchMode(cameraId, true);
            }
        } catch (CameraAccessException e) {
            Log.e(TAG, e.toString());
        }
    } else {
        mCamera = Camera.open();
        parameters = mCamera.getParameters();
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }
}

private void turnFlashlightOff() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        try {
            String cameraId;
            camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
            if (camManager != null) {
                cameraId = camManager.getCameraIdList()[0]; // Usually front camera is at 0 position.
                camManager.setTorchMode(cameraId, false);
            }
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    } else {
        mCamera = Camera.open();
        parameters = mCamera.getParameters();
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        mCamera.setParameters(parameters);
        mCamera.stopPreview();
    }
}
}

2
Que voulez-vous dire par «la caméra avant est généralement à la position 0»? Comment puis-je vérifier ce qui est devant et ce qui ne l'est pas? BTW, la caméra frontale est celle qui est dirigée vers l'utilisateur actuel. La caméra arrière est celle qui a probablement toujours un flash. Et comment puis-je vérifier si le flash est activé ou désactivé?
développeur Android

13

J'ai obtenu la lumière AutoFlash avec ci-dessous trois étapes simples.

  • Je viens d'ajouter la permission de l'appareil photo et du flash dans le fichier 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" />
  • Dans votre Camera Code, procédez de cette façon.

    //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 -> Maintenant, allez dans la zone de faible luminosité et prenez une photo, vous devriez obtenir une lumière flash automatique si l'appareil le prend en charge.


9

Android Lollipop a présenté l' API camera2 et déconseillé la précédente API camera. Cependant, l'utilisation de l'API obsolète pour activer le flash fonctionne toujours et est beaucoup plus simple que d'utiliser la nouvelle API.

Il semble que la nouvelle API soit destinée à être utilisée dans des applications de caméra complètes et dédiées et que ses architectes n'aient pas vraiment envisagé des cas d'utilisation plus simples tels que l'allumage de la lampe de poche. Pour ce faire maintenant, il faut obtenir un CameraManager, créer une CaptureSession avec une Surface factice, et enfin créer et démarrer une CaptureRequest. Gestion des exceptions, nettoyage des ressources et longs rappels inclus!

Pour voir comment allumer la lampe de poche sur Lollipop et les plus récentes, jetez un œil au FlashlightController dans le projet AOSP (essayez de trouver les API d'utilisation les plus récentes et les plus anciennes qui ont été modifiées). N'oubliez pas de définir les autorisations nécessaires.


Android Marshmallow a finalement introduit un moyen simple d'activer le flash avec setTorchMode .


1
L'ancienne API android.hardware.Camera continue de fonctionner exactement comme avant, il n'y a donc aucune raison fondamentale pour laquelle vous devez utiliser android.hardware.camera2 pour une lampe de poche. Il est possible que vous puissiez réduire la consommation d'énergie et la charge du processeur avec camera2, car vous n'avez pas besoin de conserver un aperçu actif pour activer la lampe de poche.
Eddy Talvala

J'ai essayé l'une des implémentations les plus simples sur deux appareils Lollipop et il n'a pas activé le flash, même s'il a fonctionné sur tous les appareils pré-Lollipop sur lesquels je l'ai essayé. C'est peut-être juste un bug dans Lollipop. Si les anciennes méthodes fonctionnent toujours pour vous et si vous n'êtes pas un puriste Java, continuez à utiliser l'ancienne API car c'est beaucoup plus simple :)
LukaCiko

J'ai actuellement un Nexus 5 avec Lollipop et cela fonctionne parfaitement. Je possède également une application créée par mes propres travaux et est implémentée avec ces méthodes. Au cas où quelqu'un voudrait l'essayer. J'ai mis un lien pour jouer au magasin: play.google.com/store/apps/details?id=com.fadad.linterna L'important est surtout de bien s'assurer que l'appareil photo est actif ou désactivé avant d'exécuter le flash et les autorisations.
ferdiado

Désolé, mon erreur. Une autre application utilisait probablement l'appareil photo lorsque j'ai essayé d'activer le flash avec l'ancienne API. J'ai mis à jour la réponse.
LukaCiko

7

Code complet pour Android Flashlight App

Manifeste

  <?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;
          }
      }

  }

si le flash est déjà allumé avant de commencer votre exemple, alors essayer de désactiver le flash ne fonctionnera pas ... avez-vous une solution à ce problème?
Taifun

7

Il existe différentes façons d'accéder à Camera Flash dans différentes versions d'Android. Peu d'API ont cessé de fonctionner dans Lollipop, puis elles ont été modifiées à nouveau dans Marshmallow. Pour surmonter cela, j'ai créé une bibliothèque simple que j'utilise dans peu de mes projets et qui donne de bons résultats. Il est encore incomplet, mais vous pouvez essayer de vérifier le code et trouver les pièces manquantes. Voici le lien - NoobCameraFlash .

Si vous souhaitez simplement l'intégrer dans votre code, vous pouvez utiliser gradle pour cela. Voici les instructions (tirées directement du fichier Lisezmoi) -

Étape 1. Ajoutez le référentiel JitPack à votre fichier de build. Ajoutez-le dans votre build.gradle racine à la fin des référentiels:

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

Étape 2. Ajoutez la dépendance

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

Usage

Initialisez le NoobCameraManagersingleton.

NoobCameraManager.getInstance().init(this);

Vous pouvez éventuellement définir le niveau de journalisation pour la journalisation du débogage. La journalisation utilise la bibliothèque LumberJack . Le LogLevel par défaut estLogLevel.None

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

Après cela, il vous suffit d'appeler le singleton pour activer ou désactiver le flash de l'appareil photo.

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

Vous devez prendre soin des autorisations d'exécution pour accéder à Camera vous-même, avant d'initialiser NoobCameraManager. Dans la version 0.1.2 ou antérieure, nous fournissions un support pour les autorisations directement à partir de la bibliothèque, mais en raison de la dépendance à l'objet Activity, nous devons le supprimer.

Il est également facile de basculer Flash

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

Veuillez ajouter la prise en charge de l'utilisation du contexte au lieu de l'activité. Merci!
Vajira Lasantha

@VajiraLasantha L'objet Activity est requis pour prendre l'autorisation. J'avais l'intention de supprimer complètement l'exigence en séparant les autorisations en quelque sorte. Il a été suivi ici - github.com/Abhi347/NoobCameraFlash/issues/3 En attendant, vous pouvez modifier le code pour supprimer l'exigence si vous le souhaitez. J'ai peut-être besoin d'un peu de temps pour y travailler.
Noob

Ouais j'ai vu ça. J'ai déjà modifié votre bibliothèque pour travailler avec Context en supprimant les autorisations. Parce que mon application effectue déjà des validations d'autorisation. Veuillez m'informer lorsque vous avez publié une implémentation appropriée qui prend en charge le contexte. Merci!
Vajira Lasantha

You have to take care of the runtime permissions to access Camera yourself, before initializing the NoobCameraManager. In version 0.1.2 or earlier we used to provide support for permissions directly from the library, but due to dependency on the Activity object, we have to remove it.
Pratik Butani

Que faire s'il y a plusieurs flashs sur l'appareil? Certains ont sur la caméra frontale ...
développeur Android

0

J'ai implémenté cette fonction dans mon application via des fragments utilisant SurfaceView. Le lien vers cette question de stackoverflow et sa réponse peuvent être trouvés ici

J'espère que cela t'aides :)


0

Dans Marshmallow et au-dessus, `setTorchMode () 'de CameraManager semble être la réponse. Cela fonctionne pour moi:

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

0

Essaye ça.

CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    String cameraId = null; // Usually front camera is at 0 position.
    try {
        cameraId = camManager.getCameraIdList()[0];
        camManager.setTorchMode(cameraId, true);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }

-3

Vous pouvez également utiliser le code suivant pour désactiver le flash.

Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.