251 votes

Comment allumer la lumière de flash avant programmable sur Android ?

Je veux allumer le flash frontal (pas avec l'aperçu de la caméra) de manière programmatique sur Android. J'ai cherché sur Google mais l'aide que j'ai trouvée m'a renvoyé vers cette page

Est-ce que quelqu'un a des liens ou du code d'exemple?

0 votes

2021 .. C'est maintenant très facile dans Android moderne .. stackoverflow.com/a/66585201/294884

415voto

Kartik Points 12151

Pour 2021, avec CameraX, c'est maintenant super facile : https://stackoverflow.com/a/66585201/294884


Pour ce problème, vous devez :

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

  2. Si oui, alors éteignez/allumez

  3. Si ce n'est pas le cas, vous pouvez faire ce que vous voulez, en fonction des besoins de votre application.

Pour Vérifier la disponibilité du flash sur l'appareil :

Vous pouvez utiliser ce qui suit :

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

qui renverra true si un flash est disponible, false sinon.

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

Pour allumer/éteindre la lampe de poche :

J'ai fait des recherches et trouvé ceci concernant android.permission.FLASHLIGHT. Les autorisations du manifeste Android semblent prometteuses :

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 l'appareil photo.

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

J'ai trouvé un projet qui utilise cette autorisation. Consultez le code source de quick-settings ici http://code.google.com/p/quick-settings/ (Remarque : Ce lien est maintenant rompu).

Pour la lampe de poche, consultez 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 rompu).

Mise à jour 6 Vous pouvez également essayer d'ajouter un SurfaceView comme décrit dans cette réponse LED flashlight on Galaxy Nexus controllable by what API? Cela semble être une solution qui fonctionne sur de nombreux téléphones.

Mise à jour 5 Mise à jour majeure

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 source ouvert : http://code.google.com/p/torch/source/browse/

Mise à jour 2

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

Autre code source ouvert :

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

Mise à jour 3 (Widget pour allumer/éteindre la lumière LED de l'appareil photo)

Si vous voulez développer un widget qui allume/éteint la lumière LED de votre appareil photo, alors vous devez consulter ma réponse Widget for turning on/off camera flashlight in android.

Mise à jour 4

Si vous voulez régler l'intensité de la lumière émanant de la LED de l'appareil photo, vous pouvez consulter Can I change the LED intensity of an Android device? post complet. Notez que seuls les appareils HTC rooté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 n'ayant pas de FLASH_MODE_TORCH ou même s'ils en ont, alors la lampe de poche ne s'allume pas etc.

Typiquement Samsung crée beaucoup de problèmes.

Vous pouvez consulter les problèmes dans la liste ci-dessous :

Utiliser la lampe de poche de l'appareil photo dans Android

Allumer/Éteindre la lumière LED/flash de l'appareil photo dans Samsung Galaxy Ace 2.2.1 & Galaxy Tab

3 votes

Merci pour ton aide, ça marche pour moi! - J'ai simplement copié l'interface Flashlight et la classe HtcLedFlashlight puis j'ai appelé la méthode setOn avec true/false HtcLedFlashlight et c'est tout. --- Interface-Flashlight code.google.com/p/quick-settings/source/browse/trunk/… -- Class-HtcLedFlashlight code.google.com/p/quick-settings/source/browse/trunk/…

2 votes

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

0 votes

@Kartik j'ai utilisé votre code, mais je rencontre un problème. Après 2 secondes, la lumière s'éteint. Si j'appuie à nouveau sur le bouton, l'application se ferme brusquement. Pouvez-vous me dire pourquoi ?

35voto

Ján Lazár Points 173

De mon expérience, si votre application est conçue pour fonctionner aussi bien en mode portrait qu'en mode paysage, vous devez déclarer la variable cam comme statique. Sinon, onDestroy(), qui est appelé lors du changement d'orientation, la détruit mais ne libère pas la caméra, il n'est donc pas possible de la rouvrir.

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;// doit être statique, sinon onDestroy() la détruit

@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 le fichier manifest j'ai dû ajouter cette ligne

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

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

0 votes

Vous n'avez pas besoin de vérifier la fonctionnalité du système si la caméra est éteinte. Si cam != null, elle était allumée.

1 votes

La partie la plus utile pour moi était vous devez déclarer la variable cam comme statique

0 votes

Lors de l'importation de la classe Camera dans AndroidStudio, veillez à utiliser la classe android.hardware ...

13voto

RDC Points 9222

J'ai obtenu AutoFlash avec les trois étapes simples ci-dessous.

  • J'ai simplement ajouté l'autorisation de la caméra et du flash dans le fichier Manifest.xml

  • Dans votre code de caméra, faites comme ceci.

    //Ouvrir la caméra
    Camera  mCamera = Camera.open(); 
    
    //Obtenir les paramètres de la caméra pour la personnalisation
    Camera.Parameters parameters = mCamera.getParameters();
    
    //Vérifier si l'appareil prend en charge l'AutoFlash, si oui alors définir AutoFlash
    List flashModes = parameters.getSupportedFlashModes();
    if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO))
    {
         parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
    }
    mCamera.setParameters(parameters);
    mCamera.startPreview();
  • Construisez + Exécutez —> Maintenant, allez dans une zone faiblement éclairée et prenez une photo, vous devriez obtenir un flash automatique si l'appareil le prend en charge.

0voto

mlaferla Points 714

J'ai mis en œuvre cette fonction dans mon application à travers des fragments en utilisant SurfaceView. Le lien vers cette question sur stackoverflow et sa réponse peut être trouvé ici

J'espère que cela aide :)

-2voto

belphegor Points 34

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X