android - Delphi xe5 Android 应用程序在访问剪贴板时卡住

标签 android delphi clipboard zxing delphi-xe5

我正在使用 Delphi XE5 构建一个 Android 应用程序,该应用程序利用 Zxing 条形码应用程序,并使用剪贴板来检索结果。所有代码(无论如何大部分)都来 self 在网上找到的教程。当我按照教程进行操作时,它发挥了作用,但是当在我已经在处理的应用程序中应用相同的代码时,它不起作用。每当访问剪贴板(在“OnTimer”事件中)时,应用程序总是挂起并停止工作。没有错误,什么都没有。应用程序卡住,我必须通过手机的任务管理器将其关闭。

应用程序在以下行之后失败

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

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

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

我不确定从哪里开始调试,因为相同的代码可以在我按照找到的初始指南创建的另一个应用程序中运行。我还可以确认 ClipService 已正确分配,否则 Intent 甚至无法开始。任何帮助或指导将不胜感激!下面是我的代码...

这在表单的“私有(private)”变量部分中声明:

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;

这是用于开始 Intent 的按钮的单击事件:

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}

最佳答案

您没有设置如下 SCAN_MODE 参数:

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

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

关于android - Delphi xe5 Android 应用程序在访问剪贴板时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21387780/

相关文章:

delphi - 为什么delphi ide会增加windows平台定时器分辨率?

delphi - 使用 Graphics32 创建剪贴蒙版

javascript - 如何使用旧版免费 JavaScript 将标记(不仅仅是纯文本)复制到剪贴板

android - CAB "check"按钮

delphi - 如何在不更改有效文本宽度的情况下绘制缩放文本?

windows - 在不重置剪贴板链的情况下中止进程会导致麻烦吗?

javascript - 如何向复制的网页文本添加额外信息

android - 避免在 fragment 中重新加载

java - Cordova 插件 (java) 通知不会转到应用程序 - android

java - Android 多点触控 : Not detecting MotionEvent. ACTION_POINTER_DOWN