Delphi XE5 Android 调用 Google ZXing
16lz
2021-01-23
{ Google ZXing Call demo Delphi Version: Delphi XE5 Version 19.0.13476.4176 By: flcop([email protected]) }unit UMain;interfaceuses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Layouts, FMX.Memo, System.Rtti, FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, FMX.platform, FMX.Platform.Android;type TFrmMain = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; PanelOpt: TPanel; Panel2: TPanel; SBTitle: TSpeedButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SBTitleClick(Sender: TObject); private { Private declarations } FClipboardService: IFMXClipboardService; FClipboardValue: TValue; FZXingCalled: Boolean; procedure CallZXing(const ACodeMode: string); function IsIntentCallable(const AIntent: JIntent): Boolean; function GetZXingIntent: JIntent; procedure ClipboardSave; procedure ClipboardBack; procedure ShowInfo(const AInfo: string); function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; procedure CheckEnvironment; procedure OpenURL(const AURL: string); public { Public declarations } end;var FrmMain: TFrmMain;implementation{$R *.fmx}const CodeModes: array[0..2] of string = ('PRODUCT_MODE', 'QR_CODE_MODE', 'SCAN_MODE');procedure TFrmMain.Button1Click(Sender: TObject);begin // 0, 1, 2 CallZXing(CodeModes[TButton(Sender).Tag]);end;procedure TFrmMain.CallZXing(const ACodeMode: string);var LIntent: JIntent;begin ClipboardSave; FClipboardService.SetClipboard(''); LIntent := GetZXingIntent(); LIntent.putExtra(StringToJString('SCAN_MODE'), StringToJString(ACodeMode)); SharedActivity.startActivityForResult(LIntent, 0); FZXingCalled := True;end;procedure TFrmMain.CheckEnvironment;var LFMXApplicationEventService: IFMXApplicationEventService; LIsZXingCallable: Boolean; LStr: string;begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(LFMXApplicationEventService)) then LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent) else LStr := '调用失败,不支持IFMXApplicationEventService!'; if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(FClipboardService)) then LStr := LStr + sLineBreak + '调用失败, 不支持IFMXClipboardService!'; LIsZXingCallable := IsIntentCallable(GetZXingIntent); if not LIsZXingCallable then begin SBTitle.Text := '点我去ZXing下载页...'; SBTitle.OnClick := SBTitleClick; LStr := LStr + sLineBreak + '未发现ZXing, 请安装ZXing后重新启动本程序'; end else SBTitle.Text := 'Google ZXing Call'; ShowInfo(LStr.Trim); PanelOpt.Enabled := Assigned(LFMXApplicationEventService) and Assigned(FClipboardService) and LIsZXingCallable;end;procedure TFrmMain.ClipboardBack;begin FClipboardService.SetClipboard(FClipboardValue);end;procedure TFrmMain.ClipboardSave;begin FClipboardValue := FClipboardService.GetClipboard;end;procedure TFrmMain.FormCreate(Sender: TObject);begin CheckEnvironment;end;function TFrmMain.GetZXingIntent: JIntent;const GOOGLE_ZXING = 'com.google.zxing.client.android.SCAN'; GOOGLE_ZXING_PACKAGE = 'com.google.zxing.client.android';begin Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING)); Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE));end;function TFrmMain.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;var LResult: string;begin if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then begin LResult := FClipboardService.GetClipboard.ToString; if LResult.IsEmpty then ShowInfo('扫描取消') else ShowInfo(LResult); ClipboardBack; FZXingCalled := False; end; Result := True;end;function TFrmMain.IsIntentCallable(const AIntent: JIntent): Boolean;var LJPackageManager: JPackageManager;begin Result := False; if Assigned(AIntent) then begin LJPackageManager := SharedActivityContext.getPackageManager; Result := LJPackageManager.queryIntentActivities(AIntent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size <> 0; end;end;procedure TFrmMain.OpenURL(const AURL: string);var LIntent: JIntent;begin LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(AURL))); SharedActivity.startActivity(LIntent);end;procedure TFrmMain.SBTitleClick(Sender: TObject);begin OpenURL('http://code.google.com/p/zxing/downloads/list');end;procedure TFrmMain.ShowInfo(const AInfo: string);begin Memo1.Text := AInfo;end;end.
更多相关文章
- Android 程序真退出与假退出后台运行详解
- 判断android应用程序是否已安装
- Android应用程序之间共享文字和图片(一)
- Android实时采集视频,并在PC上显示出采集到的视频的程序
- Android 检测程序异常崩溃,重启应用
- Android应用程序获取ROOT权限代码
- android交叉编译c程序
- Android应用程序键盘(Keyboard)消息处理机制分析(23)
- Android判断程序是否第一次启动