Delphi xe5调用外部扫描程序——谷歌 zxing
- unit uZXing;
- interface
- uses
- System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
- FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
- FMX.Layouts,
- System.Rtti,
- {$IF DEFINED(ANDROID)}
- FMX.Helpers.Android,
- Androidapi.JNI.Net,
- Androidapi.JNI.GraphicsContentViewText,
- Androidapi.JNI.JavaTypes,
- FMX.Platform.Android,
- {$ENDIF}
- FMX.platform;
- const
- C_CodeModes: array[0..2] of string = ('PRODUCT_MODE', 'QR_CODE_MODE', 'SCAN_MODE');
- type
- TCodeMode =(PRODUCT_MODE,QR_CODE_MODE,SCAN_MODE);
- TOnScanFinished =procedure(sData:string)of object;
- TZXingCall = class(TObject)
- private
- FClipboardService: IFMXClipboardService;
- FClipboardValue: TValue;
- FZXingCalled: Boolean;
- FZXingApkOpened: Boolean;
- FOnScanFinished:TOnScanFinished;
- FCanUse:Boolean;
- FOnInstallFinished:TNotifyEvent;
- procedure ClipboardSave;
- procedure ClipboardBack;
- {$IF DEFINED(ANDROID)}
- function GetZXingIntent: JIntent;
- function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
- function IsIntentCallable(const AIntent: JIntent): Boolean;
- {$ENDIF}
- public
- FAAppEvent: TApplicationEvent;
- constructor Create(Sender:TObject);
- destructor Destroy; override;
- procedure CallZXing( CodeMode:TCodeMode=SCAN_MODE);
- {$IF DEFINED(ANDROID)}
- function CheckEnvironment(var ErrorID:Integer):Boolean;
- {$ENDIF}
- procedure OpenURL(const AURL: string);
- procedure openFile(const sPath: string);
- property OnScanFinished:TOnScanFinished read FOnScanFinished write FOnScanFinished;
- property OnInstallFinished:TNotifyEvent read FOnInstallFinished write FOnInstallFinished;
- end;
- implementation
- { TZXingCall }
- procedure TZXingCall.CallZXing(CodeMode:TCodeMode);
- {$IF DEFINED(ANDROID)}
- var
- LIntent: JIntent;
- {$ENDIF}
- begin
- FZXingApkOpened := false;
- if not FCanUse then Exit;
- ClipboardSave;
- FClipboardService.SetClipboard('');
- {$IF DEFINED(ANDROID)}
- LIntent := GetZXingIntent();
- LIntent.putExtra(StringToJString('SCAN_MODE'), StringToJString(C_CodeModes[ord(CodeMode)]));
- SharedActivity.startActivityForResult(LIntent, 0);
- {$ENDIF}
- FZXingCalled := True;
- end;
- {$IF DEFINED(ANDROID)}
- function TZXingCall.CheckEnvironment(var ErrorID:Integer): Boolean;
- var
- LFMXApplicationEventService: IFMXApplicationEventService;
- LIsZXingCallable: Boolean;
- LStr: string;
- begin
- Result := False;
- if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService,
- IInterface(LFMXApplicationEventService)) then begin
- LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent)
- end else begin
- ErrorID :=-1;
- end;
- if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
- IInterface(FClipboardService)) then begin
- ErrorID :=-2;
- end;
- LIsZXingCallable := IsIntentCallable(GetZXingIntent);
- if not LIsZXingCallable then
- begin
- ErrorID :=-3;
- end ;
- result := Assigned(LFMXApplicationEventService) and
- Assigned(FClipboardService) and LIsZXingCallable;
- FCanUse := result;
- end;
- function TZXingCall.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;
- function TZXingCall.HandleAppEvent(AAppEvent: TApplicationEvent;
- AContext: TObject): Boolean;
- var
- LResult: string;
- ErrorID:Integer;
- begin
- if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then
- begin
- LResult := FClipboardService.GetClipboard.ToString;
- FClipboardService.SetClipboard('');
- if Assigned(FOnScanFinished) then begin
- FOnScanFinished(LResult);
- end;
- ClipboardBack;
- FZXingCalled := False;
- end;
- if FZXingApkOpened and (AAppEvent = TApplicationEvent.aeBecameActive) then
- begin
- //--
- if Assigned(FOnInstallFinished) then begin
- FAAppEvent := AAppEvent;
- FOnInstallFinished(self);
- end;
- if self.CheckEnvironment(ErrorID) then begin
- FZXingApkOpened := False;
- self.CallZXing(QR_CODE_MODE);
- end;
- end;
- Result := True;
- end;
- function TZXingCall.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;
- {$ENDIF}
- procedure TZXingCall.ClipboardBack;
- begin
- FClipboardService.SetClipboard(FClipboardValue);
- end;
- procedure TZXingCall.ClipboardSave;
- begin
- FClipboardValue := FClipboardService.GetClipboard;
- end;
- constructor TZXingCall.Create(Sender: TObject);
- begin
- //--
- FCanUse := False;
- FZXingApkOpened := False;
- end;
- procedure TZXingCall.OpenURL(const AURL: string);
- {$IF DEFINED(ANDROID)}
- var
- LIntent: JIntent;
- {$ENDIF}
- begin
- {$IF DEFINED(ANDROID)}
- LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
- TJnet_Uri.JavaClass.parse(StringToJString(AURL)));
- SharedActivity.startActivity(LIntent);
- {$ENDIF}
- end;
- procedure TZXingCall.openFile(const sPath: string);
- {$IF DEFINED(ANDROID)}
- var
- LIntent: JIntent;
- barfile:JFile;
- {$ENDIF}
- begin
- {$IF DEFINED(ANDROID)}
- LIntent := TJIntent.JavaClass.init();
- LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
- LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
- barfile := TJFile.JavaClass.init(StringToJString(sPath));
- barfile.setReadable(True,False); //--这几句很重要,不然调不出来安装包
- barfile.setWritable(True,False);
- LIntent.setDataAndType(TJnet_Uri.JavaClass.fromFile(barfile),
- StringToJString('application/vnd.android.package-archive'));
- //--SharedActivity.startActivity(LIntent);
- SharedActivity.startActivityForResult(LIntent, 0);
- FZXingApkOpened := True;
- {$ENDIF}
- end;
- destructor TZXingCall.Destroy;
- begin
- inherited;
- end;
- end.
Delphi xe5调用外部扫描程序——谷歌 zxing的更多相关文章
- windows下调用外部exe程序 SHELLEXECUTEINFO
本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...
- c# 调用外部exe程序
c#调用外部exe程序,首先要 using System.Diagnostics; 然后开启一个新process System.Diagnostics.ProcessStartInfo p=null; ...
- C++调用外部应用程序
很多时候,我们的程序需要调用DOS命令,通过Dos命令调用其他程序从而完成所需要完成的功能.比如,调用Dos程序PKZIP完成ZIP包的解压缩,调用SVN完成文件的更新或者上传.但是在程序运行时又要求 ...
- Delphi XE5教程5:程序的结构和语法
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- Delphi XE5教程4:程序和单元概述
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- Delphi XE5教程2:程序组织
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- [转]VC中调用外部exe程序方式
本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProce ...
- 减小Delphi XE5编译出来的程序体积
默认Delphi XE, XE2, XE3,XE4,XE5, XE6 ... 编译出来的程序体积很大. 一般用两个方法可以很大程度上减少程序体积. 一.在工程中用编译指令禁用RTTI 禁用的方法很简单 ...
- C++调用外部应用程序的方法的整理总结(常用)
一.三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些 ...
随机推荐
- 二叉苹果树 - 二叉树树型DP
传送门 中文题面: 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说没有只有 1 个儿子的结点,这棵树共有N 个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一 ...
- WPF入门(三)->几何图形之不规则图形(PathGeometry) (2)
原文:WPF入门(三)->几何图形之不规则图形(PathGeometry) (2) 上一节我们介绍了PathGeometry中LineSegment是点与点之间绘制的一条直线,那么我们这一节来看 ...
- WPF入门(三)->两个几何图形合并(CombinedGeometry)
原文:WPF入门(三)->两个几何图形合并(CombinedGeometry) 在WPF中,提供了一个CombinedGeometry对象可以使两个几何图形合并产生效果 CombinedGeom ...
- IT企业级应?开发模式演化
原文:IT企业级应?开发模式演化 前端研发流程 传统To B类系统的研发模式 探索 & 思考设计模式库(DPL)设计语⾔设计语⾔详解基于MVVM模式的Web框架 & UI库优化后的开发 ...
- 机器学习:scikit-learn 做笑脸识别 (SVM, KNN, Logisitc regression)
scikit-learn 是 Python 非常强大的一个做机器学习的包,今天介绍scikit-learn 里几个常用的分类器 SVM, KNN 和 logistic regression,用来做笑脸 ...
- WPF中CAD control的XAML实现
原文:WPF中CAD control的XAML实现 下面这个XAML文件是cad control里面最重要的一部分,使用Grid包含Viewport,Viewport中包括Camera和mod ...
- SVN使用教程(基于SAE)
TortoiseSVN is an easy-to-use SCM / source control software for Microsoft Windows and possibly the b ...
- 键盘各键对应的编码值(key code)
原文:键盘各键对应的编码值(key code) 来源:http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes ...
- AABB边框、OBB边框、通过比较球包围
1) AABB 包围盒: AABB 包围盒是与坐标轴对齐的包围盒, 简单性好, 紧密性较差(尤其对斜对角方向放置的瘦长形对象, 採用AABB, 将留下非常大的边角空隙, 导致大量不是必需的包围盒相交測 ...
- WPF 将Bitmapsource转换到Emgu.cv.image
原文:WPF 将Bitmapsource转换到Emgu.cv.image Transform WPF BitmapSource to Emgu.CV.Image******* /// <summ ...