Je développe une fonctionnalité avec la possibilité de basculer la torche dans des états ON/OFF. Il y a quelques jours, nous avons vu une nouvelle bibliothèque de Google en io2019 . J'ai eu une idée, pourquoi ne pas l'utiliser.
Après un certain temps, je ne vois aucune possibilité d'utiliser la seule torche de la bibliothèque.
Même dans la documentation officielle, je n'ai pas pu trouver de bonnes informations pour moi, de plus, l'exemple d'application de leur n'a pas non plus à gérer mon cas.
Avez-vous quelque chose en tête qui est facile à mettre en œuvre ou peut-être savez-vous comment le faire avec CameraX?
J'ai peur d'utiliser camera ou camera2 car la quantité de code à coller est terrible.
Liens :
[1] https://developer.Android.com/training/camerax
[2] https://proandroiddev.com/Android-camerax-preview-analyze-capture-1b3f403a9395
[3] https://github.com/Android/camera/tree/master/CameraXBasic
[4] https://github.com/Android/camera/tree/master/CameraXBasic
CameraX est une Android Jetpack qui a été construite dans le but de faciliter le développement de la caméra.
Je ne peux pas commenter, donc je réponds pour développer la réponse de yevhen_69.
La définition de enabledTorch (true) ne fonctionnait pas non plus pour moi, mais j'ai trouvé que je devais définir enableTorch (true) après l'appel à CameraX.bindToLifecycle
val previewConfig = PreviewConfig.Builder().apply {
setLensFacing(lensFacing)
// Any setup
setTargetRotation(viewFinder.display.rotation)
}.build()
val preview = Preview(previewConfig)
CameraX.bindToLifecycle(this, preview)
preview.enableTorch(true)
Cependant, sur une note secondaire, CameraX est toujours en Alpha, il est donc conseillé d'utiliser toujours l'API Camera2.
androidx.camera:camera-core:1.0.0-alpha06
La nouvelle version de CameraX offre ces fonctionnalités. CameraInfo ajouté avec les API Check Flash Available et Sensor Rotation, référez-vous link
try {
CameraInfo cameraInfo = CameraX.getCameraInfo(currentCameraLensFacing);
LiveData<Boolean> isFlashAvailable = cameraInfo.isFlashAvailable();
flashToggle.setVisibility(isFlashAvailable.getValue() ? View.VISIBLE : View.INVISIBLE);
} catch (CameraInfoUnavailableException e) {
Log.w(TAG, "Cannot get flash available information", e);
flashToggle.setVisibility(View.VISIBLE);
}
val previewConfig = PreviewConfig.Builder().apply {
setLensFacing(lensFacing)
// Any setup
setTargetRotation(viewFinder.display.rotation)
}.build()
val preview = Preview(previewConfig)
preview.enableTorch(true)
Vous pouvez activer la torche sur l'objet Preview
. https://developer.Android.com/reference/androidx/camera/core/Preview.html#enableTorch (boolean)
Et vous pouvez définir le mode flash (on/off/auto) sur l'objet ImageCapture
ou sur le générateur de configuration associé. https://developer.Android.com/reference/androidx/camera/core/ImageCapture.html#setFlashMode (androidx.camera.core.FlashMode)https://developer.Android .com/reference/androidx/camera/core/ImageCaptureConfig.Builder.html # setFlashMode (androidx.camera.core.FlashMode)
androidx.camera:camera-core:1.0.0-alpha10
Vous pouvez vérifier si la torche est disponible ou non avec ceci:
val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalyzer)
camera.cameraInfo.hasFlashUnit()
Et vous pouvez activer la torche avec:
camera.cameraControl.enableTorch(true)
C'est une façon de le faire (Kotlin). S'il y a une meilleure façon, faites-le moi savoir. Le code suivant suppose que vous avez déjà établi la disponibilité de la mémoire flash sur l'appareil.
Déclarer une var flashMode
private var flashMode: Int = ImageCapture.FLASH_MODE_OFF
Dans updateCameraUI, définissez un écouteur
controls.findViewById<ImageButton>(R.id.flash_button).setOnClickListener {
when (flashMode) {
ImageCapture.FLASH_MODE_OFF ->
flashMode = ImageCapture.FLASH_MODE_ON
ImageCapture.FLASH_MODE_ON ->
flashMode = ImageCapture.FLASH_MODE_AUTO
ImageCapture.FLASH_MODE_AUTO ->
flashMode = ImageCapture.FLASH_MODE_OFF
}
// Re-bind use cases to include changes
bindCameraUseCases()
}
Dans bindCameraUseCases, définissez le mode flash
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
.setTargetAspectRatio(screenAspectRatio)
.setTargetResolution(screenSize)
.setTargetRotation(rotation)
.setFlashMode(flashMode)
.build()