Delphi xe5调用外部扫描程序——谷歌 zxing
- unit uZXing;
- interface
- uses
- System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
- FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
- FMX.Layouts,
- System.Rtti,
- {$IF DEFINED(ANDROID)}
- FMX.Helpers.Android,
- Androidapi.JNI.Net,
- Androidapi.JNI.GraphicsContentViewText,
- Androidapi.JNI.JavaTypes,
- FMX.Platform.Android,
- {$ENDIF}
- FMX.platform;
- const
- C_CodeModes: array[0..2] of string = ('PRODUCT_MODE', 'QR_CODE_MODE', 'SCAN_MODE');
- type
- TCodeMode =(PRODUCT_MODE,QR_CODE_MODE,SCAN_MODE);
- TOnScanFinished =procedure(sData:string)of object;
- TZXingCall = class(TObject)
- private
- FClipboardService: IFMXClipboardService;
- FClipboardValue: TValue;
- FZXingCalled: Boolean;
- FZXingApkOpened: Boolean;
- FOnScanFinished:TOnScanFinished;
- FCanUse:Boolean;
- FOnInstallFinished:TNotifyEvent;
- procedure ClipboardSave;
- procedure ClipboardBack;
- {$IF DEFINED(ANDROID)}
- function GetZXingIntent: JIntent;
- function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
- function IsIntentCallable(const AIntent: JIntent): Boolean;
- {$ENDIF}
- public
- FAAppEvent: TApplicationEvent;
- constructor Create(Sender:TObject);
- destructor Destroy; override;
- procedure CallZXing( CodeMode:TCodeMode=SCAN_MODE);
- {$IF DEFINED(ANDROID)}
- function CheckEnvironment(var ErrorID:Integer):Boolean;
- {$ENDIF}
- procedure OpenURL(const AURL: string);
- procedure openFile(const sPath: string);
- property OnScanFinished:TOnScanFinished read FOnScanFinished write FOnScanFinished;
- property OnInstallFinished:TNotifyEvent read FOnInstallFinished write FOnInstallFinished;
- end;
- implementation
- { TZXingCall }
- procedure TZXingCall.CallZXing(CodeMode:TCodeMode);
- {$IF DEFINED(ANDROID)}
- var
- LIntent: JIntent;
- {$ENDIF}
- begin
- FZXingApkOpened := false;
- if not FCanUse then Exit;
- ClipboardSave;
- FClipboardService.SetClipboard('');
- {$IF DEFINED(ANDROID)}
- LIntent := GetZXingIntent();
- LIntent.putExtra(StringToJString('SCAN_MODE'), StringToJString(C_CodeModes[ord(CodeMode)]));
- SharedActivity.startActivityForResult(LIntent, 0);
- {$ENDIF}
- FZXingCalled := True;
- end;
- {$IF DEFINED(ANDROID)}
- function TZXingCall.CheckEnvironment(var ErrorID:Integer): Boolean;
- var
- LFMXApplicationEventService: IFMXApplicationEventService;
- LIsZXingCallable: Boolean;
- LStr: string;
- begin
- Result := False;
- if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService,
- IInterface(LFMXApplicationEventService)) then begin
- LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent)
- end else begin
- ErrorID :=-1;
- end;
- if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
- IInterface(FClipboardService)) then begin
- ErrorID :=-2;
- end;
- LIsZXingCallable := IsIntentCallable(GetZXingIntent);
- if not LIsZXingCallable then
- begin
- ErrorID :=-3;
- end ;
- result := Assigned(LFMXApplicationEventService) and
- Assigned(FClipboardService) and LIsZXingCallable;
- FCanUse := result;
- end;
- function TZXingCall.IsIntentCallable(const AIntent: JIntent): Boolean;
- var
- LJPackageManager: JPackageManager;
- begin
- Result := False;
- if Assigned(AIntent) then
- begin
- LJPackageManager := SharedActivityContext.getPackageManager;
- Result := LJPackageManager.queryIntentActivities(AIntent,
- TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size <> 0;
- end;
- end;
- function TZXingCall.HandleAppEvent(AAppEvent: TApplicationEvent;
- AContext: TObject): Boolean;
- var
- LResult: string;
- ErrorID:Integer;
- begin
- if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then
- begin
- LResult := FClipboardService.GetClipboard.ToString;
- FClipboardService.SetClipboard('');
- if Assigned(FOnScanFinished) then begin
- FOnScanFinished(LResult);
- end;
- ClipboardBack;
- FZXingCalled := False;
- end;
- if FZXingApkOpened and (AAppEvent = TApplicationEvent.aeBecameActive) then
- begin
- //--
- if Assigned(FOnInstallFinished) then begin
- FAAppEvent := AAppEvent;
- FOnInstallFinished(self);
- end;
- if self.CheckEnvironment(ErrorID) then begin
- FZXingApkOpened := False;
- self.CallZXing(QR_CODE_MODE);
- end;
- end;
- Result := True;
- end;
- function TZXingCall.GetZXingIntent: JIntent;
- const
- GOOGLE_ZXING = 'com.google.zxing.client.android.SCAN';
- GOOGLE_ZXING_PACKAGE = 'com.google.zxing.client.android';
- begin
- Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING));
- Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE));
- end;
- {$ENDIF}
- procedure TZXingCall.ClipboardBack;
- begin
- FClipboardService.SetClipboard(FClipboardValue);
- end;
- procedure TZXingCall.ClipboardSave;
- begin
- FClipboardValue := FClipboardService.GetClipboard;
- end;
- constructor TZXingCall.Create(Sender: TObject);
- begin
- //--
- FCanUse := False;
- FZXingApkOpened := False;
- end;
- procedure TZXingCall.OpenURL(const AURL: string);
- {$IF DEFINED(ANDROID)}
- var
- LIntent: JIntent;
- {$ENDIF}
- begin
- {$IF DEFINED(ANDROID)}
- LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
- TJnet_Uri.JavaClass.parse(StringToJString(AURL)));
- SharedActivity.startActivity(LIntent);
- {$ENDIF}
- end;
- procedure TZXingCall.openFile(const sPath: string);
- {$IF DEFINED(ANDROID)}
- var
- LIntent: JIntent;
- barfile:JFile;
- {$ENDIF}
- begin
- {$IF DEFINED(ANDROID)}
- LIntent := TJIntent.JavaClass.init();
- LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
- LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
- barfile := TJFile.JavaClass.init(StringToJString(sPath));
- barfile.setReadable(True,False); //--这几句很重要,不然调不出来安装包
- barfile.setWritable(True,False);
- LIntent.setDataAndType(TJnet_Uri.JavaClass.fromFile(barfile),
- StringToJString('application/vnd.android.package-archive'));
- //--SharedActivity.startActivity(LIntent);
- SharedActivity.startActivityForResult(LIntent, 0);
- FZXingApkOpened := True;
- {$ENDIF}
- end;
- destructor TZXingCall.Destroy;
- begin
- inherited;
- end;
- end.
Delphi xe5调用外部扫描程序——谷歌 zxing的更多相关文章
- windows下调用外部exe程序 SHELLEXECUTEINFO
本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...
- c# 调用外部exe程序
c#调用外部exe程序,首先要 using System.Diagnostics; 然后开启一个新process System.Diagnostics.ProcessStartInfo p=null; ...
- C++调用外部应用程序
很多时候,我们的程序需要调用DOS命令,通过Dos命令调用其他程序从而完成所需要完成的功能.比如,调用Dos程序PKZIP完成ZIP包的解压缩,调用SVN完成文件的更新或者上传.但是在程序运行时又要求 ...
- Delphi XE5教程5:程序的结构和语法
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- Delphi XE5教程4:程序和单元概述
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- Delphi XE5教程2:程序组织
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- [转]VC中调用外部exe程序方式
本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProce ...
- 减小Delphi XE5编译出来的程序体积
默认Delphi XE, XE2, XE3,XE4,XE5, XE6 ... 编译出来的程序体积很大. 一般用两个方法可以很大程度上减少程序体积. 一.在工程中用编译指令禁用RTTI 禁用的方法很简单 ...
- C++调用外部应用程序的方法的整理总结(常用)
一.三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些 ...
随机推荐
- TextView中实现跑马灯的最简单方法
几行代码实现跑马灯效果,效果如下: 因为很简单,所以就直接贴代码喽 <TextView android:id="@+id/item1_title_message" andro ...
- 【codeforces 787C】Berzerk
[题目链接]:http://codeforces.com/contest/787/problem/C [题意] 给你怪物一开始所在的位置; 然后两人轮流操作; 可以选择让这个怪物前进自己的集合里面所拥 ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(一)
原文:利用WPF建立自己的3d gis软件(非axhost方式)(一) 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew 密码:1te1 地 ...
- C#后台调用前台js方法
前台js方法(写在head标签之内) <script type="text/javascript" language="javascript"> f ...
- Linux在出现/java: cannot execute binary file
位这样的情况下通常的虚拟机(32和64)不匹配造成的.再次,你的虚拟机下一场比赛JDK的版本号的 在与X64它是64位置,另32位置 版权声明:本文博主原创文章.博客,未经同意不得转载.
- 简单几步教你实现移动硬盘PE、装win7/vista! 一盘在手,系统无忧!
第一步:格式化u盘成为ntfs格式.(以下同样适用于移动硬盘)提供两个方法:,方法一是格式化成fat32,再到命令提示符即俗称的dos窗口运行convert.方法二在xp下,点击u盘所在盘符,选择属性 ...
- WPF公章制作之2
原文:WPF公章制作之2 早前,我曾写过一篇:"在WPF中制作正圆形公章"(http://blog.csdn.net/johnsuna/archive/2007/10/12/182 ...
- 转:PyQt4学习资料汇总 from coderzh
一个月前研究了下PyQt4,感觉比较不错.相比wxpython,界面美观了很多,并且将界面设计与代码逻辑很好的分离了开来.关于PyQt4的资料也不少,这里我将我找到的资料汇总一下,以防自己以后忘得一干 ...
- git clone命令简介
git clone: 正如上图,当我们打开终端的情况下,默认我们所在的目录是在/home/shiyanlou的,大家可以在终端输入以下命令把目录切换到桌面cd /home/Desktop这个时候输入 ...
- 数据源Source 目标Target
数据源Source-目标Target 数据源实现INotifyPropertyChanged接口,实现“通知”目标实现依赖属性 举例 后台的数据源,实现INotifyPropertyChanged接口 ...