Компонент FMX TCameraComponent с ошибкой IFMXCameraService

#android #delphi #camera #firemonkey

#Android #delphi #камера #firemonkey

Вопрос:

В приложении мне нужно отсканировать штрих-код, затем получить доступ к камере для съемки фотографий с последующим дальнейшим сканированием штрих-кода.

Поэтому я использую как интерфейс TCameraComponent, так и интерфейс IFMXCameraService.

Проблема возникает, как только я запускаю TCameraComponent (для сканирования кода штрих-кода), затем деактивирую его и делаю снимок … когда я возвращаюсь к TCameraComponent, я получаю ошибку: вызванное исключение класса EJNIException с сообщением «java.lang.RuntimeException: ошибка получения параметров (пустые параметры)».

Важное уточнение: если вы сначала получаете фотографию, а затем открываете сканер штрих-кода, ошибки нет. Ошибка появляется, если вы открываете сканер штрих-кода хотя бы один раз, закрываете его, делаете снимок и снова открываете сканер.

Запустите сканер:

     if ( Length( AGrantResults ) = 1 ) and ( AGrantResults[ 0 ] = TPermissionStatus.Granted ) then
     begin
      SetCaptureSetting();
      FBuffer.Clear( TAlphaColors.White );
      FActive := True;
      LabelFPS.Text := 'Start capturing...';
      FCamera.Active := True;
      StartStopWatch();
      lblScanning.Text := 'Scan On';
      FaLblScanning.Enabled := True;
     end else
      Showmessage( '' );
  

Остановить сканер:

  lblScanning.Text := 'Scan Off';
 FaLblScanning.Enabled := False;
 FActive := False;
 DisplaySlowWarning(False);
 FCamera.Active := False; 
 LabelFPS.Text := '';
  

Сделайте снимок:

 var
 Params: TParamsPhotoQuery;
 Service: IFMXCameraService;
begin
 if TPlatformServices.Current.SupportsPlatformService( IFMXCameraService, Service ) then
  begin
   Params.Editable := False;
   Params.NeedSaveToAlbum    := False;
   Params.RequiredResolution := TSize.Create( 1080, 1920 );
   Params.OnDidFinishTaking  := DoDidFinish;
   Service.TakePhoto( btnTakePhoto, Params );
  end else
   ShowMessage('This device does not support the camera service');
  

Я попытался сделать сервис глобальным и использовать Service := nil после съемки, не помогло.

Комментарии:

1. Что делает SetCaptureSetting() и что такое «сканер штрих-кода», о котором вы говорите?

2. Функция SetCaptureSetting () устанавливает FCamera. Capturesettings := CaptureSettings[ CaptureSettingsIndex ]; CaptureSettings: TArray<TVideoCaptureSetting>; Это массив настроек, полученный ранее. Я use:github.com/Spelt/ZXing . Delphi, но я не думаю, что проблема в сканере. Я попытался полностью отключить его, и здесь описана аналогичная проблема с другим сканером, но решение не найдено delphi-developers-archive.blogspot.com/2016/06/hi-guys.html

3. Вы пробовали это: delphiworlds.com/2020/11/native-camera-ios-android

Ответ №1:

Попробуйте добавить свойство перед активацией камеры

CameraComponent.Quality := FMX.Media.TVideoCaptureQuality.MediumQuality;

Комментарии:

1. В конечном итоге это сработало для оригинального плаката?