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灵活一些 ...
随机推荐
- noip刷题记录 20170823
独木桥 怎么说呢 #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...
- Maven项目中读取src/main/resources目录下的配置文件
在Maven项目的开发中,当需要读取src/下的配置文件时,该怎么做? 我们假设Resources下有一个文件名为kafka.properties的配置文件(为什么用kafka.properties, ...
- sparksql load/save
java public class LoadAndSaveDemo { private static SparkConf conf = new SparkConf().setAppName(" ...
- BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)
标题效果:定整N(N <= 1e7),乞讨1<=x,y<=N和Gcd(x,y)素数的数(x,y)有多少.. 思考:推,. 建立gcd(x,y) = p,然后,x / p与y / p互 ...
- 【38.46%】【codeforces 615E】Hexagons
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- Cross-Domain Security For Data Vault
Cross-domain security for data vault is described. At least one database is accessible from a plural ...
- 自己动手编写一个VS插件(五)
作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...
- iOS 注册或登录页面(UILable,UITextField,UIButton)
注册或登录页面 例如下面的附图 1,为了在这里展示UITextField文本框关联的键盘设置.在这里,"password"和"判定password"关联键盘被设 ...
- XamlReader 动态加载XAML
原文:XamlReader 动态加载XAML XAML: <Grid xmlns:x="http://schemas.microsoft.com/client/2006" x ...
- hbase结合hive和sqoop实现数据指导mysql
hive综合hbase两个优势表中的: 1.实现数据导入到MYSQL. 2.实现hbase表转换为另外一张hbase表. 三个操作环节: 1.hbase关联hive作为外部 ...