From 2a7264020cfcceca7a21aaba4d706355e8f407af Mon Sep 17 00:00:00 2001 From: Oscar Date: Sat, 22 Oct 2022 23:05:31 -0500 Subject: [PATCH 1/2] correction for call getParameters using the object created at flashlight opening camera --- plyer/platforms/android/flash.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plyer/platforms/android/flash.py b/plyer/platforms/android/flash.py index eec1ae385..482db8acc 100644 --- a/plyer/platforms/android/flash.py +++ b/plyer/platforms/android/flash.py @@ -42,8 +42,8 @@ def _camera_open(self): if not flash_available: return self._camera = Camera.open() - self._f_on = Camera.getParameters() - self._f_off = Camera.getParameters() + self._f_on = self._camera.getParameters() + self._f_off = self._camera.getParameters() self._f_on.setFlashMode(CameraParameters.FLASH_MODE_TORCH) self._f_off.setFlashMode(CameraParameters.FLASH_MODE_OFF) self._camera.startPreview() From 36cf32f913814d649defc45af6fff876ca71b33a Mon Sep 17 00:00:00 2001 From: Oscar Date: Sun, 23 Oct 2022 10:10:15 -0500 Subject: [PATCH 2/2] added support for flashlight using newer api CameraManager --- plyer/platforms/android/flash.py | 69 ++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/plyer/platforms/android/flash.py b/plyer/platforms/android/flash.py index 482db8acc..f5fe6bcba 100644 --- a/plyer/platforms/android/flash.py +++ b/plyer/platforms/android/flash.py @@ -5,51 +5,70 @@ """ from plyer.facades import Flash -from jnius import autoclass -from plyer.platforms.android import activity +from jnius import autoclass, cast +from plyer.platforms.android import activity, SDK_INT + +if SDK_INT < 23: #use the deprecated api + Camera = autoclass("android.hardware.Camera") + CameraParameters = autoclass("android.hardware.Camera$Parameters") + SurfaceTexture = autoclass("android.graphics.SurfaceTexture") +else: + Context = autoclass('android.content.Context') -Camera = autoclass("android.hardware.Camera") -CameraParameters = autoclass("android.hardware.Camera$Parameters") -SurfaceTexture = autoclass("android.graphics.SurfaceTexture") PackageManager = autoclass('android.content.pm.PackageManager') pm = activity.getPackageManager() flash_available = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH) - class AndroidFlash(Flash): _camera = None def _on(self): + if self._camera is None: self._camera_open() - if not self._camera: - return - self._camera.setParameters(self._f_on) + if not self._camera: + return + + if SDK_INT < 23: + self._camera.setParameters(self._f_on) + else: + self._camera.setTorchMode(self._cameraid, True) def _off(self): + if not self._camera: return - self._camera.setParameters(self._f_off) + + if SDK_INT < 23: + self._camera.setParameters(self._f_off) + else: + self._camera.setTorchMode(self._cameraid, False) def _release(self): - if not self._camera: - return - self._camera.stopPreview() - self._camera.release() - self._camera = None + if SDK_INT < 23: + if not self._camera: + return + self._camera.stopPreview() + self._camera.release() + self._camera = None - def _camera_open(self): + def _camera_open(self): if not flash_available: return - self._camera = Camera.open() - self._f_on = self._camera.getParameters() - self._f_off = self._camera.getParameters() - self._f_on.setFlashMode(CameraParameters.FLASH_MODE_TORCH) - self._f_off.setFlashMode(CameraParameters.FLASH_MODE_OFF) - self._camera.startPreview() - # Need this for Nexus 5 - self._camera.setPreviewTexture(SurfaceTexture(0)) - + + if SDK_INT < 23: + self._camera = Camera.open() + self._f_on = self._camera.getParameters() + self._f_off = self._camera.getParameters() + self._f_on.setFlashMode(CameraParameters.FLASH_MODE_TORCH) + self._f_off.setFlashMode(CameraParameters.FLASH_MODE_OFF) + self._camera.startPreview() + # Need this for Nexus 5 + self._camera.setPreviewTexture(SurfaceTexture(0)) + else: + service = activity.getSystemService(Context.CAMERA_SERVICE) + self._camera = cast('android.hardware.camera2.CameraManager', service) + self._cameraid = self._camera.getCameraIdList()[0] def instance(): return AndroidFlash()