Когда вы закрываете намерение с помощью аппаратной кнопки «Назад», это останавливает приложение.

Я создал приложение для Android с помощью Delphi XE6 и использовал код, найденный в Интернете, для подключения к ZXing BarCode Scanner.

В новом проекте, который использует только этот код, все работает нормально!

Если я добавляю несколько TabControl, ToolBar, Label, Edit, Button и других стандартных компонентов, у меня происходит вот что:

  1. ZXing запускается правильно, и если я регулярно сканирую штрих-код обратно в свое приложение.
  2. Если я закрываю ZXing с помощью аппаратной кнопки «Назад», ZXing закрывается, но приложение зависает с черным экраном.

При отладке приложение вроде не останавливается. Код возврата исправлен, и поток продолжается до конца, не выдавая никакой ошибки.

Код вызова:

function TZXing.ZXingScan: Boolean;
var
  Intent: JIntent;
  ResolveInfo: JResolveInfo;
begin
  Intent := TJIntent.JavaClass.init( StringToJString( 'com.google.zxing.client.android.SCAN' ) );
  Intent.setPackage( StringToJString( 'com.google.zxing.client.android' ) );
  Intent.putExtra( StringToJString( 'SAVE_HISTORY' ), False );
  ResolveInfo := SharedActivity.getPackageManager.resolveActivity( Intent, 0 );
  Result := ResolveInfo <> nil;
  if Result then
    SharedActivity.startActivityForResult( Intent, 0 );
end;

Код процедуры обратного вызова:

procedure TZXing.OnZXingResult( RequestCode, ResultCode: Integer; Data: JIntent );
begin
  TMessageManager.DefaultManager.Unsubscribe( TMessageResultNotification, FMessageSubscriptionID );
  FMessageSubscriptionID := 0;
  if ( RequestCode = 0 ) and Assigned( FResultProcedure ) then
  begin
    if ResultCode = TJActivity.JavaClass.RESULT_OK then
    begin
      if Assigned( Data ) then
        Result := ( OK, JStringToString( Data.getStringExtra( StringToJString( 'SCAN_RESULT_FORMAT') ) ), JStringToString( Data.getStringExtra( StringToJString( 'SCAN_RESULT' ) ) ) )
      else
        Result := ERROR;
    end else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then
      Result := CANCELED;
  end;
end;

Я пробовал все и пробовал все, но я не могу найти решение.


person user3703876    schedule 03.06.2014    source источник


Ответы (2)


Я думаю, что проблема может быть в методе, в котором вы обрабатываете кнопку «Назад». Вот мой код для кнопки возврата:

procedure TFrmBezoekverslag.FormKeyUp(Sender: TObject; var Key: Word;
  var KeyChar: Char; Shift: TShiftState);
var
  FService: IFMXVirtualKeyboardService;
begin
  if Key = vkHardwareBack then
  begin
      TPlatformServices.Current.SupportsPlatformService
        (IFMXVirtualKeyboardService, IInterface(FService));
      if (FService <> nil) and (TVirtualKeyboardState.Visible
        in FService.VirtualKeyBoardState) then
      begin
        // Back button pressed, keyboard visible, so do nothing...
      end
      else
      begin
        // Back button pressed, keyboard not visible or not supported on this platform
        // Here you handle the code too close ZXING
        Key := 0; //If you don't want the form too close you need too add key=0
      end;
  end;
end;

Если это не помогает, проблема, вероятно, где-то в методе formClose, если он у вас есть.

person Remi    schedule 08.08.2014

Скорее всего, ваш код результата null, так как вызываемый Activity должен явно установить это. Попробуйте переопределить onBackPressed(), чтобы установить код результата «Отменено», прежде чем вызывать super.

person r2DoesInc    schedule 03.06.2014
comment
Большое спасибо за быстрый ответ! Я уже создал событие с этим кодом: CanClose := MessageDlg( SCanClose, TMsgDlgType.mtConfirmation, [ TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], - 1) = mrYes; Если я не использую этот код, когда я закрываю ZXing, мое приложение также закрывается. - person user3703876; 03.06.2014
comment
if ( RequestCode = 0 ), скорее всего, проблема. вы уверены, что у вас есть действительный RequestCode в этот момент? - person r2DoesInc; 03.06.2014
comment
На самом деле я просто следовал всем примерам, которые приводят в интернете. Также я не понимаю, почему с приложением, в котором есть только использование XZing, все работает исправно! - person user3703876; 03.06.2014