gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:45:36 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com