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. 移动应用拉起微信小程序

    APP支持打开微信小程序了 最新微信文档 如何实现APP打开小程序 通过文档打开微信开放平台添加移动应用,然后关联小程序,这些步骤按照文档描述走. IOS开发示例参考 android开发示例参考 开发 ...

  2. Swift 中的高阶函数和函数嵌套

    高阶函数 在Swift中,函数可做为“一等公民”的存在,也就意味着,我们可以和使用 int 以及 String 一样,将函数当做 参数.值.类型来使用. 其中,将函数当作一个参数和值来使用可见下: t ...

  3. ASP.NET中进度条的简单应用

    <html xmlns="http://www.w3.org/1999/xhtml" id="mainWindow"> <head> & ...

  4. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. wpf控件开发基础(5) -依赖属性实践

    原文:wpf控件开发基础(5) -依赖属性实践 知识回顾 接上篇,回顾这三篇讲了什么东西 首先说明了属性的现存问题,然后介绍了依赖属性的基本用法及其解决方案,由于依赖属性以静态属性的方式存在,进而又介 ...

  6. Swift程式语言(中国版)(8.8 %)

    前言 今天Apple宣布了一项新的编程语言Swift.还提供了一个近400页The Swift Programming Language(Swift程式语言). 虽然我没有开发者账户.不能实际锻炼机S ...

  7. C++第11周(春)项目4 - 类族的设计

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目4 - 类族的设计]按下面的提示,由基类 ...

  8. [Erlang危机](4.4)命名管道

    原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface . .To connect to the node, you use the ...

  9. 机器学习: Python with Recurrent Neural Network

    之前我们介绍了Recurrent neural network (RNN) 的原理: http://blog.csdn.net/matrix_space/article/details/5337404 ...

  10. python3操作注册表设置/取消IE代理

    import io, sys, time, re, os import winreg def enableProxy(IP, Port): proxy = IP + ":" + s ...