Включите вспышку во время обнаружения штрих-кода с помощью Vision API - Xamarin Android - PullRequest
0 голосов
/ 01 ноября 2018

Я использую Google Vision API для сканирования штрих-кода в своем мобильном приложении. Наряду с этим я пытаюсь включить вспышку света. Но в последней версии Vision API я не могу найти какой-либо метод для включения флэш-памяти. Поэтому я использую метод ниже для включения и выключения Flash (который работает отлично). Но API камеры устарел, и я не уверен, как реализовать то же самое с использованием Camera2 API.

код, который я использую - с устаревшим API камеры - работает

public void TurnFlashOn(bool status = false)
        {
            var camera = GetCamera(_cameraSource);
            var paramts = camera.GetParameters();
            if (status)
                paramts.FlashMode = Camera.Parameters.FlashModeTorch;
            else
                paramts.FlashMode = Camera.Parameters.FlashModeOff;
            camera.SetParameters(paramts);
        }



        private Camera GetCamera(CameraSource cameraSource)
        {
            var sourceObject = cameraSource.JavaCast<Java.Lang.Object>();
            var fields = sourceObject.Class.GetDeclaredFields();
            foreach (var field in fields)
            {
                if (field.Type.CanonicalName.Equals("android.hardware.camera", StringComparison.OrdinalIgnoreCase))
                {
                    field.Accessible = true;
                    var camera = field.Get(sourceObject);
                    var cCamera = (Camera)camera;
                    return cCamera;
                }
            }
            return null;
        }

Я попробовал приведенный ниже код, но запускается исключение "Android.Hardware.Camera2.CameraAccessException: CAMERA_IN_USE (4): setTorchMode: 1654:"

Camera 2 API пытается включить вспышку вместе с Vision API

 public void TurnOnFlash()
        {
            var manager = (CameraManager)Context.GetSystemService(Context.CameraService);
            manager.RegisterTorchCallback(new FlashLightCallback(), null);
            manager.SetTorchMode(manager.GetCameraIdList()[0], true);
        }

        public void TurnOffFlash()
        {
            var manager = (CameraManager)Context.GetSystemService(Context.CameraService);
            manager.SetTorchMode(manager.GetCameraIdList()[0], false);
        }

Кроме того,

Как долго Google предоставляет доступ к устаревшему API. Это нормально, чтобы пойти с устаревшим API. Есть мысли по этому поводу?

...