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

时间:2014-01-27 17:40:39

标签: android delphi clipboard zxing delphi-xe5

我正在使用Delphi XE5构建Android应用程序,该应用程序利用Zxing条形码应用程序并使用剪贴板检索结果。所有的代码(无论如何)都来自我在网上找到的教程。当我按照教程进行操作时,它可以实现魅力,但是当我在我正在处理的应用程序中应用SAME代码时 - 它不起作用。每当访问剪贴板(在'OnTimer'事件中)时,应用程序总是挂起并停止工作。没有错误,没有。应用程序冻结,我必须通过手机的任务管理器关闭它。

应用程序在以下行

之后立即失败
Log.Add('AndroidClipboardScanner:1'); Log.SaveToFile(INIFileLog);

我已经更改了编码,以便应用程序假设剪贴板服务在Ontimer事件中可用并且它继续但在以下行之后失败:

Log.Add('AndroidClipboardScanner:4'); Log.SaveToFile(INIFileLog);

我不知道从哪里开始调试,因为相同的代码在我找到的初始指南后创建的其他应用程序中有效。我还可以确认正确分配了ClipService,否则意图甚至不会开始。任何帮助或指导将不胜感激!以下是我的代码......

此声明在表格的“私人”变量部分中声明:

ClipService: IFMXClipboardService;

这在Timer1的'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;

在表格的ONCreate程序中:

  if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
  IInterface(ClipService)) then begin
    ShowMessage('Clipboard Failed:1');
    ClipService := nil;
  end;
  Elapsed := 0;

这是针对开始意图的按钮的点击事件:

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}

1 个答案:

答案 0 :(得分:0)

您没有设置SCAN_MODE参数,如:

intent.putExtra(tjintent.JavaClass.EXTRA_TEXT,
 stringtojstring('"SCAN_MODE","ONE_D_MODE,QR_CODE_MODE,PRODUCT_MODE,DATA_MATRIX_MODE"'));

您还可以查看计时器间隔参数... 我在几台设备上测试了该解决方案。 间隔值较低时,我有时会出现黑屏