Réponses:
Pour ce problème, vous devez:
Vérifiez si la lampe de poche est disponible ou non?
Si c'est le cas, désactivez / activez
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_TORCH
ou 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
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()
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.
you need to declare the variable cam as static
Camera
classe, AndroidStudio
faites attention à être une android.hardware
classe ...
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();
}
}
}
J'ai obtenu la lumière AutoFlash avec ci-dessous trois étapes simples.
<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.
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 .
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;
}
}
}
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'
}
Initialisez le NoobCameraManager
singleton.
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();
}
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.
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 :)
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);
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();
}