Delphi xe5 Android应用程序在访问剪贴板时冻结

Delphi xe5 Android应用程序在访问剪贴板时冻结,android,delphi,clipboard,zxing,delphi-xe5,Android,Delphi,Clipboard,Zxing,Delphi Xe5,我正在使用DelphiXe5为Android构建一个应用程序,该应用程序使用Zxing条形码应用程序,并使用剪贴板检索结果。所有代码(大部分代码)都来自我在网上找到的教程。当我遵循教程时,它非常有效,但是当我在应用程序中应用我已经在使用的相同代码时,它就不起作用了。每当访问剪贴板时(在“OnTimer”事件中),应用程序总是挂起并停止工作。没有错误,什么都没有。应用程序冻结,我必须通过手机的任务管理器关闭它 应用程序在下一行之后立即失败 Log.Add('AndroidClipboardScan

我正在使用DelphiXe5为Android构建一个应用程序,该应用程序使用Zxing条形码应用程序,并使用剪贴板检索结果。所有代码(大部分代码)都来自我在网上找到的教程。当我遵循教程时,它非常有效,但是当我在应用程序中应用我已经在使用的相同代码时,它就不起作用了。每当访问剪贴板时(在“OnTimer”事件中),应用程序总是挂起并停止工作。没有错误,什么都没有。应用程序冻结,我必须通过手机的任务管理器关闭它

应用程序在下一行之后立即失败

Log.Add('AndroidClipboardScanner:1'); Log.SaveToFile(INIFileLog);
我更改了编码,因此应用程序假定剪贴板服务在Ontimer事件中可用,并继续进行,但在以下行之后失败:

Log.Add('AndroidClipboardScanner:4'); Log.SaveToFile(INIFileLog);
我不确定从何处开始调试,因为我按照找到的初始指南创建的另一个应用程序中也使用了相同的代码。我还可以确认ClipService被正确分配,否则意图甚至不会开始。任何帮助或指导都将不胜感激!下面是我的代码

这在表格的“私有”变量部分声明:

ClipService: IFMXClipboardService;
  if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
  IInterface(ClipService)) then begin
    ShowMessage('Clipboard Failed:1');
    ClipService := nil;
  end;
  Elapsed := 0;
这在计时器1的“OnTimer”事件中:

procedure TMain_Form.Timer1Timer(Sender: TObject);
var
  barCode : String;
begin
timer1.Enabled := false;
Log.Add('AndroidClipboardScanner:0.1'); Log.SaveToFile(INIFileLog);
  Try
    if assigned(ClipService) then begin
    Log.Add('AndroidClipboardScanner:1'); Log.SaveToFile(INIFileLog);
       if (ClipService.GetClipboard.ToString <> 'nil') then
        begin
          Log.Add('AndroidClipboardScanner:2'); Log.SaveToFile(INIFileLog);
          timer1.Enabled := false;
          Log.Add('AndroidClipboardScanner:3'); Log.SaveToFile(INIFileLog);
          Elapsed := 0;
          Log.Add('AndroidClipboardScanner:4'); Log.SaveToFile(INIFileLog);
          editHold.PasteFromClipboard;
          //EditHold.Text := ClipService.GetClipboard.ToString;
          Log.Add('AndroidClipboardScanner:5'); Log.SaveToFile(INIFileLog);
        end else
        begin
          Log.Add('AndroidClipboardScanner:6'); Log.SaveToFile(INIFileLog);
          Timer1.Enabled := False;
          Log.Add('AndroidClipboardScanner:7'); Log.SaveToFile(INIFileLog);
        end;
        Log.Add('AndroidClipboardScanner:8'); Log.SaveToFile(INIFileLog);
    end else begin
      ShowMessage('Unexpected error has occured');
    end;
  Except
    ShowMessage('Unexpected error has occured..');
  End;
end;
这是用于开始意图的按钮的单击事件:

procedure TMain_Form.Button_ShowScannerClick(Sender: TObject);
{$IFDEF ANDROID}
var
  intent: JIntent; {$ENDIF}
begin
{$IFDEF ANDROID}
  //ShowMessage('Scanner:1');
  if assigned(ClipService) then begin
          //ShowMessage('Scanner:2');
          ClipService.SetClipboard('nil');
          intent := tjintent.Create;
          intent.setAction(stringtojstring('com.google.zxing.client.android.SCAN'));
          intent.putExtra(tjintent.JavaClass.EXTRA_INTENT,
            stringtojstring('"SCAN_MODE"'));
          sharedactivity.startActivityForResult(intent,0);
          Elapsed := 0;
          timer1.Enabled := true;
          //ShowMessage('Scanner:3');
      end;
{$ENDIF}

您没有设置扫描模式参数,如:

intent.putExtra(tjintent.JavaClass.EXTRA_TEXT,
 stringtojstring('"SCAN_MODE","ONE_D_MODE,QR_CODE_MODE,PRODUCT_MODE,DATA_MATRIX_MODE"'));
您还可以检查计时器间隔参数。。。 我在少数设备上测试了该解决方案。
由于间隔值较低,我有时会出现黑屏

您能写入日志文件吗?这似乎失败了,不是剪贴板操作。是的,它确实正确地写入日志。我的意思是,在正确执行这些行之后,它会失败。