web-dev-qa-db-fra.com

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

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

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

213
saiket

Pour ce problème, vous devriez:

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

  2. Si oui, alors activer/désactiver

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

Pour Vérifier la disponibilité du flash sur le périphérique: 

Vous pouvez utiliser les éléments suivants:

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

qui retournera 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 googlé et j'ai entendu parler de Android.permission.FLASHLIGHT. L'autorisation 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 réglez 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 permettant d'éteindre la lumière LED de l'appareil photo. 

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

Je viens de trouver un projet qui utilise cette permission. Vérifiez le code src de quick-settings. 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 un SurfaceView comme décrit dans cette réponse lampe de poche à DEL de Galaxy Nexus contrôlable par quelle API? Cela semble être une solution qui fonctionne sur de nombreux téléphones.

Update 5 Mise à jour majeure

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

Mise à jour 1

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

Mise à jour 2

Exemple montrant comment activer le voyant 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/

Update 3 (Widget pour allumer/éteindre le voyant de la caméra)

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

Mise à jour 4

Si vous souhaitez régler l'intensité de la lumière provenant de la caméra LED, vous pouvez vous référer Puis-je modifier l'intensité de la LED d'un appareil Android? post complet. Notez que seuls les appareils HTC enracinés prennent en charge cette fonctionnalité.

** Problèmes:**

Il y a aussi des problèmes lors de l'activation/désactivation de la lampe de poche. par exemple. pour les appareils n'ayant pas FLASH_MODE_TORCH ou même si c'est le cas, la lampe de poche ne s'allume pas, etc.

Généralement, Samsung crée beaucoup de problèmes. 

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

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

Allumer/éteindre la caméra LED/flash dans Samsung Galaxy Ace 2.2.1 & Galaxy Tab

379
Kartik Domadiya

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 cam comme statique. Sinon, onDestroy(), appelé lors du changement d'orientation, le détruit mais ne libère pas l'appareil photo, il est donc impossible de le 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;// 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" />

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

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

36
Ján Lazár

Dans l'API 23 ou supérieure (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; // Usually back camera is at 0 position.
    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"/>

EDIT ADDITIONAL

Les gens votaient toujours ma réponse alors j'ai décidé de poster 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; // Usually front camera is at 0 position.
            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();
    }
}
}
16
Jack the Ripper

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

  • Je viens d'ajouter l'autorisation Appareil photo et Flash dans Manifest.xml file
<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" />
  • Procédez de cette façon dans le code de la caméra.

    //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();
    
  • Construire + Exécuter -> Maintenant Accédez à la zone de la lumière et de la photo Snap, vous devriez obtenir la lumière du flash automatique si le périphérique prend en charge.

13
swiftBoy

Android Lollipop a introduit la camera2 _ API et désapprouve la précédente API de la caméra. Cependant, l'utilisation de l'API obsolète pour activer la mémoire 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 dédiées à une caméra dotée de fonctionnalités complètes 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, il faut obtenir un CameraManager, créer une CaptureSession avec une surface factice, puis enfin créer et démarrer un CaptureRequest. Gestion des exceptions, nettoyage des ressources et longs rappels inclus!

Pour savoir comment allumer la lampe de poche sur Lollipop et les versions plus récentes, consultez le fichier FlashlightController du projet AOSP (essayez de trouver les API les plus récentes et les plus anciennes ayant é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 .

8
LukaCiko

Il existe différentes manières d'accéder à Camera Flash dans différentes versions d'Android. Peu d'API ont cessé de fonctionner dans Lollipop, puis à nouveau modifiées dans Marshmallow. Pour remédier à cela, j'ai créé une bibliothèque simple que j'ai utilisée dans quelques projets et qui donne de bons résultats. Il est toujours incomplet, mais vous pouvez essayer de vérifier le code et de trouver les pièces manquantes. Voici le lien - NoobCameraFlash .

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

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

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

Étape 2. Ajouter la dépendance

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

Usage

Initialisez le singleton NoobCameraManager.

NoobCameraManager.getInstance().init(this);

Vous pouvez éventuellement définir le niveau de journalisation pour la journalisation de débogage. La journalisation utilise LumberJack library. Le LogLevel par défaut est LogLevel.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 vous occuper des autorisations d'exécution pour accéder à Camera avant d’initialiser NoobCameraManager. Dans la version 0.1.2 ou auparavant, nous fournissions une assistance pour les autorisations directement à partir de la bibliothèque, mais en raison de la dépendance à l’objet Activity, nous devons retirez-le.

Il est également facile d'activer Flash

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

Code complet pour l'application Android Flashlight

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

  }
6
RAP

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

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

0
Michele La Ferla

À partir de Marshmallow et ci-dessus, `setTorchMode () '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
aecl755