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. 【BZOJ 1014】 [JSOI2008]火星人prefix

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1014 [题意] 让你在线查询最长公共前缀. 支持单节点修改; 插入操作; [题解] / ...

  2. 【心情】2016ICPC青岛站打铁记

    Day0 下午到的青岛; 然后就在下面这两个地方转了很久:一直找不到公交站台 路上还看到了一个类似堡垒的东西:感觉屌屌的. 然后在落日的余晖下:我们找到了公交站台; 路上不知道他们在讨论什么:GPS什 ...

  3. 【codeforces 534D】Handshakes

    [题目链接]:http://codeforces.com/contest/534/problem/D [题意] n个人依次进入一个房间; 进进来的人会和房间里面没有组队的人握一次手; (这里的握手只计 ...

  4. htmlunit 模拟登录 无验证码

    1.模拟登录csdn,最开始的时候使用的是httpclient,网上的所有模拟登录csdn的版本都是找到lt/execution/event_id.连同用户名及密码 一起发送即可,但是目前的csdn的 ...

  5. flex新的心得

    主要是对于flex: 与width: 的心得,先看代码. <head> <meta charset="UTF-8"> <meta name=" ...

  6. 数据结构:点之间的最短距离--Floyd算法

    Floyd算法 Floyd算法 Dijkstra算法是用于解决单源最短路径问题的,Floyd算法则是解决点对之间最短路径问题的.Floyd算法的设计策略是动态规划,而Dijkstra採取的是贪心策略. ...

  7. 《深入浅出WPF》笔记——资源篇

    原文:<深入浅出WPF>笔记--资源篇 前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源.我们平时的“资源”一词是指“资财之源”,是创造人类社会财富的源泉.在计算机程 ...

  8. WPF窗口继承实现统一风格的自定义窗口

    如何实现一个窗口的风格(style),让所有的窗口都继承这样同样的风格,包括标题栏,放大.缩小和关闭按钮. 那么,我们可不可以就建立一个Base窗口,然后将这个窗口的风格给设计好之后,所有的窗口都继承 ...

  9. 一言不合就写socket的post和get请求(拼内容,然后发出去即可)

    一言不合就写socket的post和get请求.写个桌面程序,利用java写get和post请求.测试成功: SocketReq.java package com.test.CipherIndex; ...

  10. Android开发 ----------怎样真机调试?

    一般来说 真机调试 是最快的, 所以建议 大家 直接用真机调试.