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灵活一些 ...
随机推荐
- 自动化部署脚本,给每一台主机装上JDK,且配好环境变量
centos6.7 当我们有很多台主机,想在每台机器上都安装一样的某些软件,当然,一台机器一台机器安装也是可以的,但是如果有一键安装所有机器上的软件那是不是很激动人心呢! 首先我们需要制作一台服务器, ...
- 征服OA 飞鱼工作流程的在线培训课程(两)HTML形成基于
表HTML的重要作用,等效混凝土框架建筑的行,于div在此之前流行.是否所有形式的世界.在角色表页面主要是针对页面布局和定位.通过整合人才规划表设计出合理的页面布局. 当然.更重要的是,存在是表示数据 ...
- unix shell(壳)的简单实现
用户程序通过调用操作系统提供的系统调用(system call)API 来获得操作系统提供的各种服务.但使用 API 需要手动编写程序.对于不编程序.且需要与操作系统进行交互的用户,又如何使用操作系统 ...
- Winform中GridView分组排序实现功能
由于客户最近要扩充公司的业务,之前基于Winform+web开发混合式的系统已经不能满足他们的需求,需要从新对系统进行分区处理. 考虑到系统模块里面用到的GridView视图比较多,我就结合了DevE ...
- JavaCPP 技术使用经验总结
本文是对 JNI 技术的一个补充方法,提出了替换 JNI.JNA 的一种开源技术.首先对 JavaCPP 技术进行简单介绍及对应于其他现有方案的介绍.对比.接下来,通过一个简单的示例让大家了解 Jav ...
- android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖?
android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖? 分析原因: 主要是由于.我之前的 SDK 的版本号 更新的有点高了.低版本号是不会有这样的问题g的,新版本号中g ...
- Qt中(图片)资源的三种使用方式
Qt中使用图片资源的方法有很多种,以前我一直分不清各种之间的区别和Qt相应的处理机制,后来遇到一些实际的问题,然后再加上查阅源码和资料,总算弄明白一些事情,但是本文仅仅是个人理解,如有错误之处请告诉我 ...
- Numpy Usage Introduction
Reference : http://my.oschina.net/u/175377/blog/74406 试验性的Numpy教程 原文来自Tentative NumPy Tutorial 目录 先决 ...
- java学习笔记(2)——函数
int a = 1; a = a++; 1,取出a的值1作为a++表达式的值(a++表达式等于1) 2,a增加1变为2 3,执行赋值运算,a++表达式的值再赋给a,a又成为了1. ---------- ...
- 陈硕 - Linux 多线程服务端编程 - muduo 网络库作者
http://chenshuo.com/book/ Muduo网络库源码分析(一) EventLoop事件循环(Poller和Channel)http://blog.csdn.net/nk_test/ ...