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?
Pour ce problème, vous devriez:
Vérifiez si la lampe de poche est disponible ou non.
Si oui, alors activer/désactiver
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
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.
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();
}
}
}
J'ai obtenu AutoFlash light 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" />
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.
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 .
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'
}
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();
}
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;
}
}
}
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 :)
À 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);