我正在使用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}
答案 0 :(得分:0)
您没有设置SCAN_MODE参数,如:
intent.putExtra(tjintent.JavaClass.EXTRA_TEXT,
stringtojstring('"SCAN_MODE","ONE_D_MODE,QR_CODE_MODE,PRODUCT_MODE,DATA_MATRIX_MODE"'));
您还可以查看计时器间隔参数... 我在几台设备上测试了该解决方案。 间隔值较低时,我有时会出现黑屏