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

最新文章

  1. json序列化及反序列化
  2. Coding道场:第一次
  3. 【转】工控老鬼】西门子S7200入门&amp;精通【1】S7200硬件大全
  4. hdu 5269 ZYB loves Xor I
  5. 一段显示隐藏列表HTML代码
  6. 分享O&#39;Reilly最新C语言指针数据
  7. QT学习(对话框)codeblock版本
  8. Ubuntu系统的安装
  9. [python]类与类中的列表
  10. INSERTION_SORT插入排序C++实现
  11. CC++初学者编程教程(7) 搭建Windows EclipseCCPP软件开发环境
  12. angularJS---自定义过滤器
  13. $(window).scroll()无法触发问题
  14. 老毛桃UEFI版u盘启动盘
  15. 106. Construct Binary Tree from Inorder and Postorder Traversal根据后中序数组恢复出原来的树
  16. class类的使用
  17. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十六)Structured Streaming:WARN clients.NetworkClient: Error while fetching metadata with correlation id 1 : {my-topic=LEADER_NOT_AVAILABLE}
  18. 如果使用xutils出现了ExceptionInInitializerError这个错误
  19. g++报错原因分析:expected class-name before ‘{’ token
  20. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) F. High Cry(思维 统计)

热门文章

  1. windows下Eclipse启动tomcat提示port已被占用 already in use
  2. Mac的GUI哲学
  3. cordova使用cordova-plugin-baidumaplocation插件获取定位
  4. C#将string转换为十六进制
  5. thread、Task、async &amp; await
  6. 《菊与刀》original 的阅读
  7. 微信公众号开发系列-Http请求包基类
  8. C ++ 17 技术上已经完成,C ++ 20 也在路上(有路线图)
  9. matlab 工具函数 —— axnote(在坐标轴上写文本内容)
  10. DataGridView 鼠标双击获得行列索引