1. unit uZXing;
  2. interface
  3. uses
  4. System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  5. FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  6. FMX.Layouts,
  7. System.Rtti,
  8. {$IF DEFINED(ANDROID)}
  9. FMX.Helpers.Android,
  10. Androidapi.JNI.Net,
  11. Androidapi.JNI.GraphicsContentViewText,
  12. Androidapi.JNI.JavaTypes,
  13. FMX.Platform.Android,
  14. {$ENDIF}
  15. FMX.platform;
  16. const
  17. C_CodeModes: array[0..2] of string = ('PRODUCT_MODE', 'QR_CODE_MODE', 'SCAN_MODE');
  18. type
  19. TCodeMode =(PRODUCT_MODE,QR_CODE_MODE,SCAN_MODE);
  20. TOnScanFinished =procedure(sData:string)of object;
  21. TZXingCall = class(TObject)
  22. private
  23. FClipboardService: IFMXClipboardService;
  24. FClipboardValue: TValue;
  25. FZXingCalled: Boolean;
  26. FZXingApkOpened: Boolean;
  27. FOnScanFinished:TOnScanFinished;
  28. FCanUse:Boolean;
  29. FOnInstallFinished:TNotifyEvent;
  30. procedure ClipboardSave;
  31. procedure ClipboardBack;
  32. {$IF DEFINED(ANDROID)}
  33. function GetZXingIntent: JIntent;
  34. function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
  35. function IsIntentCallable(const AIntent: JIntent): Boolean;
  36. {$ENDIF}
  37. public
  38. FAAppEvent: TApplicationEvent;
  39. constructor Create(Sender:TObject);
  40. destructor Destroy; override;
  41. procedure CallZXing( CodeMode:TCodeMode=SCAN_MODE);
  42. {$IF DEFINED(ANDROID)}
  43. function CheckEnvironment(var ErrorID:Integer):Boolean;
  44. {$ENDIF}
  45. procedure OpenURL(const AURL: string);
  46. procedure openFile(const sPath: string);
  47. property OnScanFinished:TOnScanFinished read FOnScanFinished write FOnScanFinished;
  48. property OnInstallFinished:TNotifyEvent read FOnInstallFinished write  FOnInstallFinished;
  49. end;
  50. implementation
  51. { TZXingCall }
  52. procedure TZXingCall.CallZXing(CodeMode:TCodeMode);
  53. {$IF DEFINED(ANDROID)}
  54. var
  55. LIntent: JIntent;
  56. {$ENDIF}
  57. begin
  58. FZXingApkOpened := false;
  59. if not FCanUse then Exit;
  60. ClipboardSave;
  61. FClipboardService.SetClipboard('');
  62. {$IF DEFINED(ANDROID)}
  63. LIntent := GetZXingIntent();
  64. LIntent.putExtra(StringToJString('SCAN_MODE'), StringToJString(C_CodeModes[ord(CodeMode)]));
  65. SharedActivity.startActivityForResult(LIntent, 0);
  66. {$ENDIF}
  67. FZXingCalled := True;
  68. end;
  69. {$IF DEFINED(ANDROID)}
  70. function TZXingCall.CheckEnvironment(var ErrorID:Integer): Boolean;
  71. var
  72. LFMXApplicationEventService: IFMXApplicationEventService;
  73. LIsZXingCallable: Boolean;
  74. LStr: string;
  75. begin
  76. Result := False;
  77. if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService,
  78. IInterface(LFMXApplicationEventService)) then begin
  79. LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent)
  80. end else begin
  81. ErrorID :=-1;
  82. end;
  83. if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
  84. IInterface(FClipboardService)) then begin
  85. ErrorID :=-2;
  86. end;
  87. LIsZXingCallable := IsIntentCallable(GetZXingIntent);
  88. if not LIsZXingCallable then
  89. begin
  90. ErrorID :=-3;
  91. end ;
  92. result := Assigned(LFMXApplicationEventService) and
  93. Assigned(FClipboardService) and LIsZXingCallable;
  94. FCanUse := result;
  95. end;
  96. function TZXingCall.IsIntentCallable(const AIntent: JIntent): Boolean;
  97. var
  98. LJPackageManager: JPackageManager;
  99. begin
  100. Result := False;
  101. if Assigned(AIntent) then
  102. begin
  103. LJPackageManager := SharedActivityContext.getPackageManager;
  104. Result := LJPackageManager.queryIntentActivities(AIntent,
  105. TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size <> 0;
  106. end;
  107. end;
  108. function TZXingCall.HandleAppEvent(AAppEvent: TApplicationEvent;
  109. AContext: TObject): Boolean;
  110. var
  111. LResult: string;
  112. ErrorID:Integer;
  113. begin
  114. if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then
  115. begin
  116. LResult := FClipboardService.GetClipboard.ToString;
  117. FClipboardService.SetClipboard('');
  118. if Assigned(FOnScanFinished) then begin
  119. FOnScanFinished(LResult);
  120. end;
  121. ClipboardBack;
  122. FZXingCalled := False;
  123. end;
  124. if FZXingApkOpened and (AAppEvent = TApplicationEvent.aeBecameActive)  then
  125. begin
  126. //--
  127. if Assigned(FOnInstallFinished) then begin
  128. FAAppEvent := AAppEvent;
  129. FOnInstallFinished(self);
  130. end;
  131. if self.CheckEnvironment(ErrorID) then begin
  132. FZXingApkOpened := False;
  133. self.CallZXing(QR_CODE_MODE);
  134. end;
  135. end;
  136. Result := True;
  137. end;
  138. function TZXingCall.GetZXingIntent: JIntent;
  139. const
  140. GOOGLE_ZXING = 'com.google.zxing.client.android.SCAN';
  141. GOOGLE_ZXING_PACKAGE = 'com.google.zxing.client.android';
  142. begin
  143. Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING));
  144. Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE));
  145. end;
  146. {$ENDIF}
  147. procedure TZXingCall.ClipboardBack;
  148. begin
  149. FClipboardService.SetClipboard(FClipboardValue);
  150. end;
  151. procedure TZXingCall.ClipboardSave;
  152. begin
  153. FClipboardValue := FClipboardService.GetClipboard;
  154. end;
  155. constructor TZXingCall.Create(Sender: TObject);
  156. begin
  157. //--
  158. FCanUse := False;
  159. FZXingApkOpened := False;
  160. end;
  161. procedure TZXingCall.OpenURL(const AURL: string);
  162. {$IF DEFINED(ANDROID)}
  163. var
  164. LIntent: JIntent;
  165. {$ENDIF}
  166. begin
  167. {$IF DEFINED(ANDROID)}
  168. LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
  169. TJnet_Uri.JavaClass.parse(StringToJString(AURL)));
  170. SharedActivity.startActivity(LIntent);
  171. {$ENDIF}
  172. end;
  173. procedure TZXingCall.openFile(const sPath: string);
  174. {$IF DEFINED(ANDROID)}
  175. var
  176. LIntent: JIntent;
  177. barfile:JFile;
  178. {$ENDIF}
  179. begin
  180. {$IF DEFINED(ANDROID)}
  181. LIntent := TJIntent.JavaClass.init();
  182. LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  183. LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  184. barfile := TJFile.JavaClass.init(StringToJString(sPath));
  185. barfile.setReadable(True,False);  //--这几句很重要,不然调不出来安装包
  186. barfile.setWritable(True,False);
  187. LIntent.setDataAndType(TJnet_Uri.JavaClass.fromFile(barfile),
  188. StringToJString('application/vnd.android.package-archive'));
  189. //--SharedActivity.startActivity(LIntent);
  190. SharedActivity.startActivityForResult(LIntent, 0);
  191. FZXingApkOpened := True;
  192. {$ENDIF}
  193. end;
  194. destructor TZXingCall.Destroy;
  195. begin
  196. inherited;
  197. end;
  198. end.
 
 
http://blog.csdn.net/syndicater/article/details/18708323

Delphi xe5调用外部扫描程序——谷歌 zxing的更多相关文章

  1. windows下调用外部exe程序 SHELLEXECUTEINFO

    本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...

  2. c# 调用外部exe程序

    c#调用外部exe程序,首先要 using System.Diagnostics; 然后开启一个新process System.Diagnostics.ProcessStartInfo p=null; ...

  3. C++调用外部应用程序

    很多时候,我们的程序需要调用DOS命令,通过Dos命令调用其他程序从而完成所需要完成的功能.比如,调用Dos程序PKZIP完成ZIP包的解压缩,调用SVN完成文件的更新或者上传.但是在程序运行时又要求 ...

  4. Delphi XE5教程5:程序的结构和语法

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...

  5. Delphi XE5教程4:程序和单元概述

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...

  6. Delphi XE5教程2:程序组织

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...

  7. [转]VC中调用外部exe程序方式

    本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProce ...

  8. 减小Delphi XE5编译出来的程序体积

    默认Delphi XE, XE2, XE3,XE4,XE5, XE6 ... 编译出来的程序体积很大. 一般用两个方法可以很大程度上减少程序体积. 一.在工程中用编译指令禁用RTTI 禁用的方法很简单 ...

  9. C++调用外部应用程序的方法的整理总结(常用)

    一.三个SDK函数:  WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些 ...

随机推荐

  1. noip刷题记录 20170823

    独木桥 怎么说呢 #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...

  2. Maven项目中读取src/main/resources目录下的配置文件

    在Maven项目的开发中,当需要读取src/下的配置文件时,该怎么做? 我们假设Resources下有一个文件名为kafka.properties的配置文件(为什么用kafka.properties, ...

  3. sparksql load/save

    java public class LoadAndSaveDemo { private static SparkConf conf = new SparkConf().setAppName(" ...

  4. BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)

    标题效果:定整N(N <= 1e7),乞讨1<=x,y<=N和Gcd(x,y)素数的数(x,y)有多少.. 思考:推,. 建立gcd(x,y) = p,然后,x / p与y / p互 ...

  5. 【38.46%】【codeforces 615E】Hexagons

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  6. Cross-Domain Security For Data Vault

    Cross-domain security for data vault is described. At least one database is accessible from a plural ...

  7. 自己动手编写一个VS插件(五)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...

  8. iOS 注册或登录页面(UILable,UITextField,UIButton)

    注册或登录页面 例如下面的附图 1,为了在这里展示UITextField文本框关联的键盘设置.在这里,"password"和"判定password"关联键盘被设 ...

  9. XamlReader 动态加载XAML

    原文:XamlReader 动态加载XAML XAML: <Grid xmlns:x="http://schemas.microsoft.com/client/2006" x ...

  10. hbase结合hive和sqoop实现数据指导mysql

    hive综合hbase两个优势表中的:     1.实现数据导入到MYSQL.     2.实现hbase表转换为另外一张hbase表.  三个操作环节:      1.hbase关联hive作为外部 ...