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. Python 工具类与工具函数 —— pair

    def pair(lis): n = len(lis) for i in range(n): for j in range(i+1, n): yield lis[i], lis[j] 这样在调用端,访 ...

  2. 微信小程序实现城市定位:获取当前所在的国家城市信息

    微信小程序中,我们可以通过调用wx.getLocation()获取到设备当前的地理位置信息,这个信息是当前位置的经纬度.如果我们想获取当前位置是处于哪个国家,哪个城市等信息,该如何实现呢? 微信小程序 ...

  3. Android中使用achartengine生成图表

    今天在做项目的时候用到了图表功能,记录下来 achartengine是google的一个开源项目,可以在https://code.google.com/p/achartengine/ 下载技术文档,j ...

  4. Activity启动过程全解析

    几个系统关键对象: ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期 ActivityThread,App的真正入口.当开启App之后, ...

  5. Web报表进度条显示

    创建插件 <script src="../CreateControl.js" type="text/javascript"></script& ...

  6. quick cocos2dx lua 网络图片 下载 自己主动更新

    转载请注明,原文地址:http://blog.csdn.net/dd135373/article/details/46468505 quick coocs2d-x 网络图片下载,自己主动更新纹理,保存 ...

  7. ElasticSearch的javaAPI之Client

    翻译的原文:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/client.html#node-c ...

  8. WPF去除边框的方法

    原文:WPF去除边框的方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangsen600/article/details/81978125 W ...

  9. [STM32] IAP不能跳转到APP

    用w5500做网页iap升级, 文件上传正确, 对比内部flash内容也正确, 就是不跳转. 查资料, 怀疑是中断的影响. 在跳转前关闭中断, 问题解决! // IAP程序使用了中断, 跳转前关闭 _ ...

  10. matlab 二元函数的画法

    plot:画线(curve,二维空间以及三维空间) surf:画面(surface,一般在三维空间) 1. surf 绘图函数 surf 是 surface 的缩写,表示表面(显然至少三维图像才会有表 ...